Python 3.x 嵌套ifs从不同列获取值
我有一个dataframe df,我想根据应用于其他列的条件在列中填充值 DF的结构,ID后有一些列:Python 3.x 嵌套ifs从不同列获取值,python-3.x,pandas,dataframe,Python 3.x,Pandas,Dataframe,我有一个dataframe 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”的
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,具体取决于哪个列具有第一个非空(非null/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中实现这一点,假设ID是单元格“A1”,那么嵌套的ifs也是如此
在“最终列”的第一行中:
=IF(A2<>"",A2,IF(B2<>"",B2,IF(C2<>"",C2,IF(D2<>"",D2,"Not_found"))))
=IF(A2“”,A2,IF(B2“”,B2,IF(C2“”,C2,IF(D2“”,D2,“未找到”))
对于“状态”列
=IF(A2<>"","col1",IF(B2<>"","col2",IF(C2<>"","col3",IF(D2<>"","col4","Not_found"))))
=IF(A2”,“col1”,IF(B2”,“col2”,IF(C2”,“col3”,IF(D2”,“col4”,“未找到”))
注意:请在解决方案中使用列名,不要使用索引,因为数据框的结构可能会有所不同(列的顺序)
提前感谢您可以使用:
您可以使用:
你可以用。如果可以将列col1
中某些行中的所有NaN
值设置为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
你可以用。如果可以将列col1
中某些行中的所有NaN
值设置为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
为什么您希望第4行的
未找到
?应该是数据帧中的Q3
吗?为什么希望第4行的未找到?您的数据框中是否应该是Q3
?感谢您提供的解决方案,但是如果列“col1”出现在其他10列之后,您的解决方案是否有效?@user3875610您是否有类似col
+number的名称?我的意思是,您能在操作之前对数据帧列进行排序吗?感谢您提供的解决方案,但是如果列“col1”出现在其他10列之后,您的解决方案会起作用吗?@user3875610您有类似于列的名称吗?我的意思是,您能在该操作之前对数据帧列进行排序吗?如果列“col1”出现在其他十列之后,您能修改您的答案以使其有效吗?即,如果列“col1”出现在其他十列之后,您能修改您的答案以使其有效吗,即,第一个有效索引不会指向col1