首页 > 解决方案 > 更改熊猫数据框中预选元素中的列

问题描述

我们有一个包含三个不同列的数据框,如上面的示例(df)所示。此任务的目标是每次第1列中的字母发生变化时,用 np.nan替换第2列的第一个元素。由于正在研究的数据库非常大,因此不能使用 for 循环。此外,每个涉及转变的解决方案都被排除在外,因为它太慢了。

我相信最简单的方法是使用groupbyhead方法,但是我不知道如何在原始数据框中替换。

例子:

df = pd.DataFrame([['A','Z',1.11],['B','Z',2.1],['C','Z',3.1],['D', 'X', 2.1], ['E','X',4.3],['E', 'X', 2.1], ['F','X',4.3]])

在此处输入图像描述

要选择我们想要更改的元素,我们可以执行以下操作:

df.groupby(by=1).head(1)[2] = np.nan

但是在原始数据框中没有任何变化。
目标是获得以下内容:

在此处输入图像描述

编辑:

根据评论,我们不会df[1]返回已经看过的组,例如['Z', 'Z', 'X', 'Z']不可能。

标签: pythonpandasdataframe

解决方案


您可以numpy.where用于向量化条件赋值。这假设df[1]已经排序。

df[2] = np.where(df[1].duplicated(), df[2], np.nan)

如果不能假设排序:

df[2] = np.where(df[1] != df[1].shift(), np.nan, df[2])

结果:

   0  1    2
0  A  Z  NaN
1  B  Z  2.1
2  C  Z  3.1
3  D  X  NaN
4  E  X  4.3
5  E  X  2.1
6  F  X  4.3

等效逻辑可以使用pd.DataFrame.mask.


推荐阅读