Python 3.x 嵌套ifs从不同列获取值

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”的

我有一个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”的新列,其中“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