检查数据帧组是否包含列表中的值

Yas*_*ade 6 python dataframe python-3.x pandas

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

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
Run Code Online (Sandbox Code Playgroud)

在这里,我想检查一下挪威或 丹麦 是否出现在每个SR 中。否,请返回未找到这两个国家/地区之一的序列号!我尝试使用 groupby 并迭代国家/地区,但这没有帮助。我被困在这一点上。

因此,预期输出是:

[3,4]
Run Code Online (Sandbox Code Playgroud)

jez*_*ael 3

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

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

感谢@yatu 和@taras 的改进:

s = frozenset(L)
out = df.groupby('SR. NO')['COUNTRY_NAME'].apply(s.issubset)
Run Code Online (Sandbox Code Playgroud)

然后仅过滤 s 值的索引True:

out = out.index[~out].tolist()
print (out)
[3, 4]
Run Code Online (Sandbox Code Playgroud)

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

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]
Run Code Online (Sandbox Code Playgroud)

  • 是的@taras。如果您将“s”定义为“frozenset”,它确实可以工作。这变成了一个很好的简化 (2认同)