嵌套ifs从不同列获取值

时间:2016-01-14 05:23:45

标签: python-3.x pandas 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,具体取决于哪个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:请在解决方案中使用列名,而不是索引,因为数据框的结构可能不同(列的顺序)

提前致谢

2 个答案:

答案 0 :(得分:1)

您可以使用first_valid_index

UPDATE

答案 1 :(得分:1)

您可以使用first_valid_index。如果NaNcol1列的某行中的所有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