2017-08-04 82 views
0

我有一個DF看起來如下嵌套如果檢查一個或多個大熊貓列滿足條件

customer activity_1 activity_2 activity_3 activity_4 
    1   40   null  30   null 
    2   41   null  null  null 
    3   60   50   60   75 
    4  null  null  null  null 
    5  null   20   40   10 

問題1: 現在我需要使用嵌套增加一列,如果函數如果返回0所有活動都爲空,如果至少一個活動不爲空,則爲1;如果至少兩個活動不爲空,則爲2;如果所有活動不爲空,則爲4。

我曾嘗試遠來解決它:

def act(x): 
    if (x['activity_1'] != 'null'): 
     return 1 
    elif (x['activity_1'] != 'null') & (x['activity_2'] != 'null'): 
     return 2 
    elif (x['activity_1'] != 'null') & (x['activity_2'] != 'null') & (x['activity_3'] != 'null'): 
     return 3 
    elif (x['activity_1'] != 'null') & (x['activity_2'] != 'null') & (x['activity_3'] != 'null') & (x['activity_4'] != 'null'): 
     return 4 
    else: 
     return 0 

然後:

df['act'] = df.apply(act, axis=1) 

問題2: 添加列與存在於各種情況下的活動名稱。

我有什麼到目前爲止已經試過是定義另一個嵌套IF函數,如果在新列行事值檢查是1回活動1等

非常感謝!

+0

我到目前爲止試過的是什麼?看來你希望我們爲你寫代碼.. – iFlo

+0

我將代碼添加到問題 – Mshendy

+0

問題更新,對不起,誤導 – Mshendy

回答

2

您可以使用sumjoin與掩模以取得空的對列的特定範圍的計數和列名不爲空列,即

#Question 1 
df["sum"] = df.apply(lambda row: sum(row[1:5]=='null') ,axis=1) 

#Question 2 
mask = (df[df.columns[1:5]]!='null') 
df["activity"] = df.apply(lambda row: ','.join(mask.columns[row[1:5]!='null']),axis=1) 

您還可以使用:

df["sum"] = df.iloc[:,1:].eq('null').sum(axis=1) 

df['activity'] = df.iloc[:,1:5].ne('null').apply(lambda x: ','.join(df.columns[1:5][x]), axis=1) 

Ouptut:

 
    customer activity_1 activity_2 activity_3 activity_4 sum \ 
0   1   40  null   30  null 2 
1   2   41  null  null  null 3 
2   3   60   50   60   75 0 
3   4  null  null  null  null 4 
4   5  null   20   40   10 1 

             activity 
0      activity_1,activity_3 
1         activity_1 
2 activity_1,activity_2,activity_3,activity_4 
3            
4    activity_2,activity_3,activity_4 
In [1310]: 

希望它可以幫助

+1

非常完美! – Mshendy

+0

很高興幫助先生! – Dark

2

這裏有一個 一個 三種襯板,首先把你的 「空」 字符串轉換爲numpy.NaN值:

# Assuming your dataframe is already created and assigned to `df` 
import numpy as np 
df = df.replace("null", np.NaN) 
df = df.assign(count_null=lambda x: 4 - x.isnull().sum(axis=1)) 

注:

  • 使用assign創建一個新的列,命名爲count_null但變化無論你喜歡什麼。
  • 我硬編碼爲4列的數量,所以你可能想使這個充滿活力的,如果DF會改變形狀
  • 使用DF的拉姆達的分配x,我們使用.isnull方法總結根據內容是否爲空,將列設置爲True/False。
  • 總結結果,使用axis=1水平跨行而不是默認的垂直,串聯方法。

編輯:我已經添加了代碼爲「空」字符串轉換爲NaN值,這樣可以讓你做其他內置熊貓的計算方法,考慮到空值。如果DataFrame變大,這些操作可能比字符串比較更快。

+0

'null'是一個字符串,如何使用'isnull()'? – Dark

+0

@Bharathshetty啊,錯過了。已經更新了使用NaN/null行爲以備將來參考的替代方案。 –

相關問題