【问题标题】:Can pandas replace method be used on a view or slice to modify the original dataframe?可以在视图或切片上使用熊猫替换方法来修改原始数据框吗?
【发布时间】:2020-07-24 10:01:08
【问题描述】:

如果数据框中的某些单元格值在一个组中,我想替换它们,但如果它们是其他组,则不替换。

例如,我创建以下数据框:

import pandas as pd
df = pd.DataFrame([['a',2,3],['b',2,3],['a',3,3]], columns = ['1st', '2nd', '3rd'])
df

   1st 2nd 3rd
0   a   2   2
1   b   2   3
2   a   3   3

我想在第 1 列过滤到 'a',然后仅在第 2 列将任何 2 替换为 9 和 3 替换为 7。

df.loc[(df['1st']=='a')].replace({2:9, 3:7}, inplace = True)
df # same as original

这会尝试在切片的副本而不是视图上设置值,因此无法更新原始数据帧。也许这里有一些链式索引。我希望数据框的视图(仍然是数据框类型)允许替换方法作用于视图,从而作用于原始数据。

我发现唯一可行的方法是,我要为每个要替换的列值对使用一个命令:

df.loc[(df['1st']=='a') & (df['2nd']==2), '2nd'] = 9
df.loc[(df['1st']=='a') & (df['2nd']==3), '2nd'] = 7
df # It worked

    1st 2nd 3rd
0   a   9   2
1   b   2   3
2   a   7   3

有没有更好的方法来做到这一点?

是否可以在数据框的视图上使用替换方法或其他方法来修改原始数据?

我正在尝试了解副本与视图以及通过处理过滤结果来修改原始数据框的最佳方法。

感谢您的帮助!

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    试试update

    df.update(df.loc[(df['1st']=='a')].replace({2:9, 3:7}))
    df
      1st  2nd  3rd
    0   a  9.0  7.0
    1   b  2.0  3.0
    2   a  7.0  7.0
    

    如果不想改变类型

    df.loc[(df['1st']=='a')]=df.loc[(df['1st']=='a')].replace({2:9, 3:7})
    df
      1st  2nd  3rd
    0   a    9    7
    1   b    2    3
    2   a    7    7
    

    【讨论】:

    • 感谢 YOBEN_S!在这种情况下确实有效。有趣的是,它将变量类型更改为 float64,而另一种方法将其保留为 int。此外,如果我要在完整数据帧上处理 replace,它不会更改数据类型。
    • @PhasorLaser 这是要更新的已知问题,您可以为它执行 astype(int)
    • @PhasorLaser 我还添加了保留数据类型的分配方法
    • 我无法弄清楚如何将 astype(int) 用于此命令,但我看到了您的第二条评论。这也有助于有另一种选择。那是因为 astype(int) 在这种情况下不起作用吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-22
    • 1970-01-01
    • 2015-08-11
    • 2023-01-26
    • 1970-01-01
    相关资源
    最近更新 更多