2015-01-08 91 views
0

我想根據兩列的值基於if語句將新列添加到數據框。即如果列x ==無,則列y其他列x在帶有lambda函數的數據框中使用if語句

下面是我寫的腳本,但不起作用。有任何想法嗎?

dfCurrentReportResults['Retention'] = dfCurrentReportResults.apply(lambda x : x.Retention_y if x.Retention_x == None else x.Retention_x) 

另外我得到這個錯誤消息: AttributeError的:( 「 '系列' 對象沒有屬性 'Retention_x'」,在索引BUSINESSUNIT_NAME'u'occurred)

供參考:BUSINESSUNIT_NAME是第一列命名

附加信息:

我的數據打印出來這個樣子的,我想添加一個第3列,如果有其他人保持NaN的取一個值。

Retention_x Retention_y 
0   1   NaN 
1   NaN  0.672183 
2   NaN  1.035613 
3   NaN  0.771469 
4   NaN  0.916667 
5   NaN   NaN 
6   NaN   NaN 
7   NaN   NaN 
8   NaN   NaN 
9   NaN   NaN 

UPDATE: 最終我是有問題引用Null值或爲空在我的數據幀的最後一行代碼我用還包括軸= 1回答我的問題。

dfCurrentReportResults['RetentionLambda'] = dfCurrentReportResults.apply(lambda x : x['Retention_y'] if pd.isnull(x['Retention_x']) else x['Retention_x'], axis = 1) 

感謝@EdChum,@ strim099和@aus_lacy您所有的輸入。隨着我的數據集變大,如果我注意到性能問題,我可能會切換到np.where選項。

+0

是'None'字符串還是'NaN'?你能否提供你的數據框架樣本集,以便我們能夠更好地調試任何問題? –

+0

@aus_lacy我對None的使用基本上是一個嘗試,以確定值是否爲空,所以我猜這是一個NaN並且是None? – IcemanBerlin

+0

你打電話給你的'申請'列是什麼?您的數據樣本可以幫助您更快得到答案。 –

回答

1

找你拉姆達的工作0軸是列向的。只需將axis=1添加到apply參數列表中即可。這是清楚的記錄。

In [1]: import pandas 

In [2]: dfCurrentReportResults = pandas.DataFrame([['a','b'],['c','d'],['e','f'],['g','h'],['i','j']], columns=['Retention_y', 'Retention_x']) 

In [3]: dfCurrentReportResults['Retention_x'][1] = None 

In [4]: dfCurrentReportResults['Retention_x'][3] = None 

In [5]: dfCurrentReportResults 
Out[5]: 
    Retention_y Retention_x 
0   a   b 
1   c  None 
2   e   f 
3   g  None 
4   i   j 

In [6]: dfCurrentReportResults['Retention'] = dfCurrentReportResults.apply(lambda x : x.Retention_y if x.Retention_x == None else x.Retention_x, axis=1) 

In [7]: dfCurrentReportResults 
Out[7]: 
    Retention_y Retention_x Retention 
0   a   b   b 
1   c  None   c 
2   e   f   f 
3   g  None   g 
4   i   j   j 
+0

謝謝strimp099實際上我曾嘗試在我的某些嘗試中添加axis = 1,但得到了相同的消息。我認爲這個問題也是因爲我的數據框值可能不是無,也就是說你有什麼我沒有空白。這是同一件事,或者如果我不能使用None,我該如何參考空白? – IcemanBerlin

+0

其實無論如何,當我複製您的代碼上面,並運行您的示例數據我得到這個錯誤:AttributeError :((''系列'對象沒有屬性'Retention_x','發生在索引0') – IcemanBerlin

+0

你如何重新創建你的例子是NaN而不是None? – IcemanBerlin

2

只需使用np.where

dfCurrentReportResults['Retention'] = np.where(df.Retention_x == None, df.Retention_y, else df.Retention_x) 

這使用測試條件下,第一個參數和設定值df.Retention_y其他df.Retention_x

也避免使用apply在可能的情況,因爲這僅僅是要遍歷值np.where是一個向量化的方法,並且可以擴展得更好。

UPDATE

確定沒有必要使用np.where只需使用以下更簡單的語法:

dfCurrentReportResults['Retention'] = df.Retention_y.where(df.Retention_x == None, df.Retention_x) 

進一步更新

dfCurrentReportResults['Retention'] = df.Retention_y.where(df.Retention_x.isnull(), df.Retention_x) 
+0

沒有必要下降到'numpy' - 幀和系列也有'where'方法.. – DSM

+0

@DSM我有時會發現由於一些微妙的差異,因此我開始幀和系列'where'語法稍微混淆,所以我開始從那時起使用'np.where',或許有時間回去再看一遍,我會發佈一個更新,謝謝 – EdChum

+0

我在np.where行上收到syntex錯誤。更新的行運行,但給我以下錯誤... TypeError:無法比較鍵入系列 – IcemanBerlin