熊猫定位并将更改应用于列



这是我一直在努力解决的问题,也是一个非常初学者。从本质上讲,我希望基于另一列中的筛选器来定位列并将更改应用于该列。

示例输入。

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

最新更新