2016-01-14 90 views
0

得到的值我有一個數據幀DF,我想在一列填充值的基礎上,應用到其他列DF的嵌套IFS從不同的列

結構的條件下,ID之後還有一些列:

ID ...... col1 col2 col3 col4 
1   A1  A1  A1  A1 
2   G3   D5 
3   R6    
4     Q3 
5   M5  N8 

我要創建兩個名爲「final_col」和「狀態」,新的列,其中「final_col」具有從COL1或COL2或COL3或COL4,這取決於山坳了第一個非空(NOT NULL/NaN的價值)值。

列「狀態」是列的只是名字

預期輸出:

ID ...... col1 col2 col3 col4 final_col  status 
1   A1  A1  A1  A1  A1   col1 
2    G3   D5  G3   col2 
3   R6     L4  R6   col1 
4          Not_found  Not_found 
5    M5  N8   M5   col2 

我知道如何做到這一點在Excel中,嵌套IFS的話,假設ID是細胞「 A1'

在第一行 'final_col':

=IF(A2<>"",A2,IF(B2<>"",B2,IF(C2<>"",C2,IF(D2<>"",D2,"Not_found")))) 

對於列 '狀態'

=IF(A2<>"","col1",IF(B2<>"","col2",IF(C2<>"","col3",IF(D2<>"","col4","Not_found")))) 

PS:請在您的解決方案使用的列名,而不是索引,因爲數據幀的結構可能會有所不同(列的順序)

在此先感謝

+0

爲什麼你期望得到'不found'行4?它應該是你的數據框中的'Q3'嗎? –

回答

1

您可以使用first_valid_index。如果你能在列col1col4使用的所有NaN值在某一行:

print df 

    ID col1 col2 col3 col4 
0 1 A1 A1 A1 A1 
1 2 NaN G3 NaN D5 
2 3 R6 NaN NaN NaN 
3 4 NaN NaN NaN NaN 
4 5 NaN M5 N8 NaN 

def f1(x): 
    if x.first_valid_index() is None: 
     return 'Not_found' 
    else: 
     return str(x.first_valid_index()) 

def f2(x): 
    if x.first_valid_index() is None: 
     return 'Not_found' 
    else: 
     return x[x.first_valid_index()] 


df['status'] = df.ix[:, df.columns.tolist().index("col1") :].apply(f1, axis=1) 

df['final_col'] = df.ix[:, df.columns.tolist().index("col1") :].apply(f2, axis=1) 

print df 

    ID col1 col2 col3 col4  status final_col 
0 1 A1 A1 A1 A1  col1   A1 
1 2 NaN G3 NaN D5  col2   G3 
2 3 R6 NaN NaN NaN  col1   R6 
3 4 NaN NaN NaN NaN Not_found Not_found 
4 5 NaN M5 N8 NaN  col2   M5 
+0

如果列的col1出現在其他十列之後,您可以修改您的答案,即first_valid_index不會指向col1 –

+0

,請檢查它。 – jezrael

+0

重新排列列,它工作!謝謝 –

1

你可以使用first_valid_index

In [105]: df 
Out[105]: 
    ID col1 col2 col3 col4 
0 1 A1 A1 A1 A1 
1 2 NaN G3 NaN D5 
2 3 R6 NaN NaN NaN 
3 4 NaN NaN NaN NaN 
4 5 NaN M5 N8 NaN 

df['status'] = df.iloc[:,1:].apply(lambda x: x.first_valid_index(), axis=1) 

df['final_col'] = df.iloc[:, 1:].apply(lambda x: x[x['status']] if x['status'] != None else 'Not found', axis=1) 

df['status'].fillna('Not found', inplace=True) 

In [129]: df 
Out[129]: 
    ID col1 col2 col3 col4  status final_col 
0 1 A1 A1 A1 A1  col1   A1 
1 2 NaN G3 NaN D5  col2   G3 
2 3 R6 NaN NaN NaN  col1   R6 
3 4 NaN NaN NaN NaN Not found Not found 
4 5 NaN M5 N8 NaN  col2   M5 
+0

感謝您的解決方案,但是如果列「col1」出現在另外10列之後,您的解決方案是否會工作? –

+0

@ user3875610你有類似'col' +數字的名字嗎?我的意思是你可以在操作之前對數據幀列進行排序嗎? –