更改具有相同值的Pandas行的标签

  • 本文关键字:Pandas 标签 python pandas
  • 更新时间 :
  • 英文 :


我想为具有相同值但不同标签的行更改Pandas数据框架中的标签:

import pandas as pd
df = pd.DataFrame({"text": ["bannana", "tomato", "potato", "potato", "lemon", "cucamber"],
"label": ["fruit", "veg", "fruit", "veg", "fruit", "veg"], 
})

print(df)

text  label
0   bannana  fruit
1    tomato    veg
2    potato  fruit
3    potato    veg
4     lemon  fruit
5  cucamber    veg
如你所见,文本中有两个元素有不同的标签
2    potato  fruit
3    potato    veg

所以我想,首先,我需要确定是否有这样的行,然后更新标签列中的值。注意,我总是想把水果换成蔬菜。

所需输出:

text  label
0   bannana  fruit
1    tomato    veg
2    potato    veg
3    potato    veg
4     lemon  fruit
5  cucamber    veg

文本相同但值不同的项可以按如下方式提取:

df.groupby('text').filter(lambda x: x['label'].nunique() > 1)

结果

text    label
2   potato  fruit
3   potato  veg

没有逻辑改变是不可能的。您需要为如何更改

创建逻辑

更新

不需要为更改过滤数据框架仅使条件和mask

  1. 条件1:相同的文本但不同的值
  2. 条件2:标签是水果

则多个项目标签中的水果被替换为蔬菜。

cond1 = df.groupby('text')['label'].transform(lambda x: x.nunique() > 1)
cond2 = df['label'].eq('fruit')
df['label'] = df['label'].mask(cond1 & cond2, 'veg')

结果:

text        label
0   bannana     fruit
1   tomato      veg
2   potato      veg
3   potato      veg
4   lemon       fruit
5   cucamber    veg

这可以通过以下代码完成:

df.sort_values(by="label", ascending=False).groupby("text").label.first()
df["label"] = df["text"].map(dict(zip(df.text, df.label)))

让我们看看这里发生了什么:

  • 首先,我们按字典顺序降序对数据框进行排序:所有标记为"veg"的行将出现在标记为"fruit"的行之前。
  • 然后我们按文本分组,折叠具有相同"text"值的行(在本例中为potato)。
  • 对于每一组,我们取第一个元素:当数据帧被排序时,如果"veg"出现在组中,它将被选中。

给我们df_map,一个包含从文本到标签映射的数据框。然后,我们可以将其转换为字典,并使用DataFrame.map方法将这些映射应用到原始数据框。

注意:这种方法的优点是,如果您有比"fruit""veg"更多的标签,并且想要定义自定义标签优先级,则可以非常简单地扩展它:

order = {"fruit":0, "veg":1, "something_that_should_supersede_veg":2}
df_map = df.sort_values(by="label", key=lambda x:x.map(order), ascending=False).groupby("text").label.first()

最新更新