我有一个数据帧df,我想根据应用于其他列的条件填充列中的值
DF的结构,在ID之后有一些列:
ID ...... col1 col2 col3 col4
1 A1 A1 A1 A1
2 G3 D5
3 R6
4 Q3
5 M5 N8
我想创建两个名为'final_col'和'status'的新列,其中'final_col'的值来自col1或col2或col3或col4,具体取决于哪个col具有第一个非空(非空/ NaN)值。
列'status'只是列的名称
预期产出:
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"))))
P.S:请在解决方案中使用列名,而不是索引,因为数据框的结构可能不同(列的顺序)
提前致谢
答案 0 :(得分:1)
您可以使用first_valid_index
:
UPDATE
答案 1 :(得分:1)
您可以使用first_valid_index
。如果NaN
到col1
列的某行中的所有col4
值都可以使用:
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