【问题标题】:Search/filter only values that match an allowed combination仅搜索/过滤与允许的组合匹配的值
【发布时间】:2021-03-12 13:49:41
【问题描述】:

我有一个这样的数据框:

  ID  Toes
0  1  []
1  2  ['LF1', 'LF2']
2  4  ['LF1']
3  4  ['LF2']
4  5  ['LF1', 'LF4', 'RR1', 'RR2']
5  6  []
6  7  ['LF2', 'RF1', 'RF2']
7  8  ['LF1', 'LF2', 'LF3', 'LF4', 'LF5']

Toes 列在蜥蜴中缺少脚趾,它们总共有 20 个脚趾。我有一个给定的个体,我们称它为 Si,并想搜索它可能的匹配项。例如,这个有 2 个脚趾缺失: Si_toes = ['LF1', 'LF2'].

我如何找到唯一允许缺失脚趾的是当前脚趾的所有个体,即 ['LF1', 'LF2'] - 但不允许其他缺失值?

预期的结果应该是:

# for Si where Si_toes = ['LF1', 'LF2']
0  1  []
1  2  ['LF1', 'LF2']
2  4  ['LF1']
3  4  ['LF2']
5  6  []

我试过了

toes = ['LF1', 'LF2']
df.loc[df.Toes.apply(lambda x: bool(set(x).intersection( list(toes) )))] 

但这会返回所有包含 ['LF1', 'LF2'] 的内容,因此它包括下面的这些,这是我不想要的。

4  5  ['LF1', 'LF4', 'RR1', 'RR2']
6  7  ['LF2', 'RF1', 'RF2']
7  8  ['LF1', 'LF2', 'LF3', 'LF4', 'LF5']

也试过了:

toes = ['LF1', 'LF2']
df.loc[df.Toes.map(set(['LF1', 'LF2']).issubset)]

但这会返回所有包含 ['LF1', 'LF2'] 的行,所以它会返回我们不想要的这些:

1  2  ['LF1', 'LF2']
7  8  ['LF1', 'LF2', 'LF3', 'LF4', 'LF5']

【问题讨论】:

    标签: python pandas filter


    【解决方案1】:

    您可以从每一行中删除所有允许的缺失脚趾并检查结果集大小是否为零:

    toes = ['LF1', 'LF2']
    df.loc[df['Toes'].apply(lambda x: len(set(x) - set(toes)) == 0)]
    

    结果:

        ID  Toes
    0   1   []
    1   2   [LF1, LF2]
    2   3   [LF1]
    3   4   [LF2]
    5   6   []
    

    【讨论】:

      【解决方案2】:

      我想这就是你要找的:

      >>df[df['Toes'].apply(lambda toe: set(toes).intersection(set(toe)) == set(toes))]
        ID        Toes
      1  2  [LF1, LF2]
      

      【讨论】:

      • 谢谢,但返回的结果与 df​​.loc[df.Toes.map(set(['LF1', 'LF2']).issubset)] 相同,即所有行有'LF1','LF2',不管是否有其他缺失值。这提醒我我需要编辑我的问题,所以谢谢你:)
      猜你喜欢
      • 1970-01-01
      • 2015-06-04
      • 2011-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多