Pandas 定位并应用对列的更改

Pandas locate and apply changes to column

这是我一直在努力解决的问题,而且是非常初学者。本质上,我想根据来自另一列的筛选器找到一个列并将更改应用到该列。

示例输入。

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例程,不符合过滤条件的记录被设置为空

我的要求:

正确的 locate/filter 和应用方法。我可以使用更新实现预期的帧,但是我想使用定位和应用。

通过执行 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