屏蔽数据帧上的就地操作

时间:2017-12-21 17:59:24

标签: python pandas dataframe

我和大熊猫一点点菜鸟,我试图使用apply对屏蔽数据帧的某些部分进行一些计算和修改。我想要操作的部分是由我的面具定义的,我不想修改任何非屏蔽的值。

问题是我不知道将apply调用的结果放在掩码数据帧的正确数据帧中的正确方法是什么(或者它的副本,不是&#39 ;重要)。

以下是我正在努力解决的问题的玩具示例,我将尝试使用掩码将A列中的所有值设为负值并应用:

import pandas as pd 
import numpy as np


def make_df():
    np.random.seed(4)
    df = pd.DataFrame(np.random.randn(5, 2),columns=["A","B"])
    return df

df = make_df()
mask = (df["A"]>0)

print(df)

          A         B
0  0.050562  0.499951
1 -0.995909  0.693599
2 -0.418302 -1.584577
3 -0.647707  0.598575
4  0.332250 -1.147477

预期结果如下:

          A         B
0 -0.050562  0.499951
1 -0.995909  0.693599
2 -0.418302 -1.584577
3 -0.647707  0.598575
4 -0.332250 -1.147477

我希望能做到的是:

df = make_df()

df[mask]["A"] = df[mask]["A"].apply(lambda v: -v)
print(df)

          A         B
0  0.050562  0.499951
1 -0.995909  0.693599
2 -0.418302 -1.584577
3 -0.647707  0.598575
4  0.332250 -1.147477

但它失败了,熊猫警告我df[mask]["A"]是副本而不是视图,因此对它的修改不会影响df

2 个答案:

答案 0 :(得分:3)

尝试使用loc[]

In [11]: df.loc[mask, 'A'] *= -1

In [12]: df
Out[12]:
          A         B
0 -0.050562  0.499951
1 -0.995909  0.693599
2 -0.418302 -1.584577
3 -0.647707  0.598575
4 -0.332250 -1.147477

答案 1 :(得分:0)

您可以尝试:

df.loc[df['A'] > 0,'A'] = -df.A