【问题标题】:How do I remove rows in dataframe A that contains specific number of values from a column of another dataframe B using pandas?如何使用熊猫从另一个数据框 B 的列中删除包含特定数量值的数据框 A 中的行?
【发布时间】: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 完成这项工作?(不使用列表理解) 请帮帮我! :)

【问题讨论】:

    标签: python pandas dictionary indexing dataframe


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2022-11-21
      • 1970-01-01
      • 2017-09-27
      • 2016-09-15
      • 2016-09-09
      • 2018-01-01
      • 2020-01-04
      • 2017-01-15
      • 1970-01-01
      相关资源
      最近更新 更多