这是我一直在努力解决的问题,也是一个非常初学者。从本质上讲,我希望基于另一列中的筛选器来定位列并将更改应用于该列。
示例输入。
import pandas as pd
cols = ['col1', 'col2']
data = [
[1, 1],
[1, 1],
[2, 1],
[1, 1],
]
df = pd.DataFrame(data=data, columns=cols)
# NOTE: In practice, I will be applying a more complex function
df['col2'] = df.loc[df['col1'] == 1, 'col2'].apply(lambda x: x+1)
返回输出:
col1 col2
0 1 2.0
1 1 2.0
2 2 NaN
3 1 2.0
预期输出:
col1 col2
0 1 2
1 1 2
2 2 2
3 1 2
发生了什么:
由于我的apply/lambda例程,不符合筛选条件的记录被设置为null
我的请求:
正确的定位/筛选和应用方法。我可以使用更新来实现预期的帧,但是我想使用定位和应用。
通过执行df['col2'] = ...
,您正在设置col2
的所有值。但是,由于您只在某些值上调用apply
,因此未包含的值将设置为NaN。要解决这个问题,请保存您的口罩并重复使用:
mask = df['col1'] == 1
df.loc[mask, 'col2'] = df.loc[mask, 'col2'].apply(lambda x: x+1)
输出:
>>> df
col1 col2
0 1 2
1 1 2
2 2 1
3 1 2