【问题标题】:Checking if dataframe groups contain values from list检查数据框组是否包含列表中的值
【发布时间】:2023-03-26 17:20:01
【问题描述】:

如何根据另一列的值打印/返回值?

analyse = input[['SR. NO', 'COUNTRY_NAME']]
print(analyse)

SR. NO    COUNTRY_NAME
     2          Norway
     2         Denmark
     2         Iceland
     2         Finland
     3         Denmark
     3         Iceland
     4         Finland
     4          Norway

在这里,我想检查 挪威 丹麦是为每个 SR 呈现。否,返回未找到任一这两个国家/地区之一的那些序列号!我尝试使用groupby 并遍历国家,但这没有帮助。我被困在了这一点上。

所以,预期的输出是:

[3,4]

【问题讨论】:

    标签: python python-3.x pandas dataframe


    【解决方案1】:

    您可以使用set.issubset 测试每个组是否存在列表的所有值:

    L = ['Norway', 'Denmark']
    s = set(L)
    out = df.groupby('SR. NO')['COUNTRY_NAME'].apply(lambda x: s.issubset(x))
    

    感谢@yatu 和@taras 的改进:

    s = frozenset(L)
    out = df.groupby('SR. NO')['COUNTRY_NAME'].apply(s.issubset)
    

    然后只过滤Trues 值的索引:

    out = out.index[~out].tolist()
    print (out)
    [3, 4]
    

    在列表理解中使用过滤器的另一种解决方案:

    L = ['Norway', 'Denmark']
    s = set(L)
    out =  [k for k, v in df.groupby('SR. NO')['COUNTRY_NAME'].apply(set).items() 
                   if not s.issubset(v)]
    print (out)
    [3, 4]
    

    【讨论】:

    • 你可以直接apply(s.issubset)而不用包裹在lambda
    • @taras - 测试并获得TypeError: unhashable type: 'set'
    • 嗯,很高兴知道。所以 pandas 将它存储在某种字典中。
    • 是的@taras。如果您将s 定义为frozenset,它确实有效。这变成了一个很好的简化
    • @jezrael 我的意思是,返回一个包含 Sr. No 和 Country Name 的字典,其中没有该 Sr. No 的特定国家。示例输出:{'3': ['Normay'], '4': ['Denmark'], '5': ['Norway', 'Denmark']} OR 示例输出:(('3', ('Normay')), ('4', ('Denmark' )), ('5', ('挪威', '丹麦')))
    【解决方案2】:

    一种方法是drop_duplicatesgroupbySR.NO,获取每个组的sum,并检查哪个小于2(意味着01 中的不同元素列表包含):

    l = ['Norway', 'Denmark']
    out = (df.drop_duplicates()
             .COUNTRY_NAME.isin()
             .groupby(df['SR. NO'])
             .sum() 
             .lt(len(l)))
    out.index[out].values.tolist()
    # [3, 4]
    

    【讨论】:

    • 所以如果我要检查 4 个国家/地区,我应该将值 2 从 4 更改为?我是对的还是我误解了?
    • 是的,没错。为简单起见,单独定义列表,并取长度。我会更新@YashGhorpade
    猜你喜欢
    • 1970-01-01
    • 2019-08-10
    • 2013-10-04
    • 1970-01-01
    • 2012-08-14
    • 2019-09-21
    • 2017-09-12
    • 2015-05-25
    • 2015-01-01
    相关资源
    最近更新 更多