【问题标题】:Find values in one column that have association with certain values in another column在一个列中查找与另一列中的某些值有关联的值
【发布时间】:2020-04-07 22:47:12
【问题描述】:

我有以下示例熊猫数据框:

df = pd.DataFrame({'A': ['a1', 'a2', 'a3', 'a1', 'a2', 'a4'],
                   'B': ['b1', 'b1', 'b2', 'b3', 'b6', 'b6']})

我想在 A 中找到与 B 中输入列表的所有值相关联的值。

例如,对于输入 lst = ['b1', 'b6'],所需的输出是 ['a2']。我从here 尝试过df[df['B'].isin(lst)],但确实还不够,甚至可能没有必要。

【问题讨论】:

    标签: python pandas dataframe tabular


    【解决方案1】:

    使用列表推导对lst 的每个元素进行第一个过滤df

    a_list = [ df.loc[df['B']==el,'A'].tolist() for el in lst]
    # [['a1', 'a2'], ['a2', 'a4']]
    

    您要查找的值是a_list 中所有列表的交集

    list(set.intersection(*[set(x) for x in a_list]))
    # ['a2']
    

    【讨论】:

    • 接受了这个答案,因为它在我的实际数据帧中是最快的,大约有 2M 行、1M 唯一 A 值和 60 个唯一 B 值。其他两个答案也可以完美运行,但是这个需要 10 秒。根据您的数据/偏好,可以使用这三种中的任何一种。
    【解决方案2】:

    我们可以做到groupby + filterisin + all

    df.groupby('A').filter(lambda x : pd.Series(lst).isin(x['B']).all())
        A   B
    1  a2  b1
    4  a2  b6
    

    或者

    s=pd.crosstab(df.A,df.B).ge(1)[lst].all(1) # you have the series 
    s # s[s].index
    A
    a1    False
    a2     True
    a3    False
    a4    False
    dtype: bool
    

    【讨论】:

      【解决方案3】:

      使用set.issubset 检查一个列表是否在另一个列表中:

      m = df.groupby('A')['B'].apply(lambda x: set(lst).issubset(set(x)))
      df[df['A'].map(m)]
      
          A   B
      0  a1  b1
      1  a2  b1
      3  a1  b3
      4  a2  b6
      7  a2  b7
      8  a1  b6
      

      【讨论】:

      • 谢谢!第一个似乎不正确,因为“a4”也被错误地返回。第二个,似乎正在工作。我现在正在检查实际的大型数据帧的效率。
      • 是的,你是对的,我进行了编辑。现在第一个解决方案应该也很有效
      • 它不适用于我的实际数据。我现在找到了这个示例,但它再次不能供您参考:df = pd.DataFrame({'A': ['a1', 'a2', 'a3', 'a1', 'a2', 'a4', 'a5', 'a2', 'a1'], 'B': ['b1', 'b1', 'b2', 'b3', 'b6', 'b6', 'b7', 'b7', 'b6']}) 输出现在应该包括 a1 和 a2。但是你的(第一个)似乎是空的。其他两个答案似乎有效,但我想与您分享此反馈。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-25
      相关资源
      最近更新 更多