我想为具有相同值但不同标签的行更改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:相同的文本但不同的值
- 条件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"
的行之前。 然后我们按文本分组,折叠具有相同 - 对于每一组,我们取第一个元素:当数据帧被排序时,如果
"veg"
出现在组中,它将被选中。
"text"
值的行(在本例中为potato
)。给我们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()