我有一个简单的疑问,比如我有一个名为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"
提前致谢
答案 0 :(得分:1)
您可以使用apply
和first_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