如何使用熊猫从另一个数据框 B 的列中删除包含特定数量值的数据框 A 中的行?

Posted

技术标签:

【中文标题】如何使用熊猫从另一个数据框 B 的列中删除包含特定数量值的数据框 A 中的行?【英文标题】:How do I remove rows in dataframe A that contains specific number of values from a column of another dataframe B using pandas? 【发布时间】:2017-05-14 13:30:42 【问题描述】:

假设我有一个如下的数据框 A:

item_name
-------------------------
 nike power shoes / 50% off / only today
 nike super t-shirt / adidas / cool sale
 reebok power t-shirt / reebock shoes

另一个数据框 B 是一个品牌字典,它是:


variation  |  original

nike         nike
adidas       adidas
reebok       reebok
reebock      reebok
reeboc       reebok

(假设 reebock 和 reeboc 是“reebok”的一些变体)

我的问题是我想从数据框 A 中删除行 根据数据框 B,包含超过 1 个品牌。 所以我想要的结果如下:

item_name

nike power shoes / 50% off / only today
reebok power t-shirt / reebock shoes

你可以看到只有那一行“nike super t-shirt/adidas/cool sale” 已被删除,因为我们有 [nike] 和 [adidas]。 重要的是要知道这个逻辑是基于原始品牌,而不是变化部分。 因此,“reebok power t-shirt / reebock shoes”行没有被删除,因为 reebok 和 reebock 属于一个独特的品牌名称 [reebok]。

我怎样才能通过 pandas 完成这项工作?(不使用列表理解) 请帮帮我! :)

【问题讨论】:

【参考方案1】:

您可以将boolean indexing 与掩码一起使用。它是由apply 使用 lambda 函数创建的。首先将所有单词转换为Series,然后将map 转换为d 并比较nunique 的值:

d = df2.set_index('variation')['original']

mask = df1.item_name.apply(lambda x: pd.Series(x.split()).map(d).nunique() > 1)
print (mask)
0    False
1     True
2    False
Name: item_name, dtype: bool

print (df1[~mask])
                                 item_name
0  nike power shoes / 50% off / only today
2     reebok power t-shirt / reebock shoes

【讨论】:

以上是关于如何使用熊猫从另一个数据框 B 的列中删除包含特定数量值的数据框 A 中的行?的主要内容,如果未能解决你的问题,请参考以下文章

如何从熊猫数据框中的列中删除字符串值

从另一个数据框中删除包含相同日期的行-python-大熊猫

如何从包含文本的熊猫数据框中的列中提取年份(或日期时间)

在熊猫数据框列中查找特定文本

确定熊猫数据框中的列值何时更改

熊猫数据框:在固定其他列的列中提取具有特定标准/条件最小值的数据[重复]