根据应用于数据框中另一列的条件,填充列的行中的值

时间:2016-01-13 10:14:12

标签: python-3.x pandas

我有一个简单的疑问,比如我有一个名为df的数据框

结构:

ID   col1   col2  col3   status
1    1      A            Unmapped
2    2            X      Unmapped
3           C     Q      Unmapped
4                 S      Unmapped
5    4      E            Unmapped

我想根据条件填充“状态”列中的值。条件是如果col1中的第1行不等于空白,则列状态中的第1行必须为“mapped_one”。如果col1为空,则必须检查col2下的行是否为空,然后状态必须为'mapped_two',依旧等等

预期产出:

ID   col1   col2  col3   status
1    1      A            mapped_one
2    2            X      mapped_one
3           C     Q      mapped_two
4                 S      mapped_three
5    4      E            mapped_one

这就是我累了,但这不起作用,所有行都分配了相同的值

 df.loc[df.col1 != "    ", 'status'] = "mapped_one"

提前致谢

1 个答案:

答案 0 :(得分:1)

您可以使用applyfirst_valid_index执行此操作:

In [137]:
def func(x):
    return 'mapped' + str(x.first_valid_index())[-1]
df['status'] = df.ix[:, 1:].apply(func, axis=1)
df

Out[137]:
   ID  col1 col2 col3   status
0   1     1    A  NaN  mapped1
1   2     2  NaN    X  mapped1
2   3   NaN    C    Q  mapped2
3   4   NaN  NaN    S  mapped3
4   5     4    E  NaN  mapped1

更通用的方法是:

In [146]:
def func(x):
    return 'mapped' + str(df.columns.get_loc(x.first_valid_index()))
df.ix[:, 1:].apply(func, axis=1)

Out[146]:
0    mapped1
1    mapped1
2    mapped2
3    mapped3
4    mapped1
dtype: object

如果只想要col名称:

In [148]:
def func(x):
    return 'mapped_' + str(x.first_valid_index())
df['status'] = df.ix[:, 1:].apply(func, axis=1)
df

Out[148]:
   ID  col1 col2 col3       status
0   1     1    A  NaN  mapped_col1
1   2     2  NaN    X  mapped_col1
2   3   NaN    C    Q  mapped_col2
3   4   NaN  NaN    S  mapped_col3
4   5     4    E  NaN  mapped_col1