首页 > 解决方案 > 有没有办法检查列表项是否是列表中的唯一项?

问题描述

我有一个字典列表,整个列表代表不同的国家,每个字典都包含每个国家的基本数据,如下所示: 示例 a

df.countries[3]
"[{'iso_3166_1': 'DE', 'name': 'Germany'}, {'iso_3166_1': 'US', 'name': 'United States of America'}, {'iso_3166_1': 'IN', 'name': 'India'}]"

当然,还有其他单元格,其中国家列表只有一个这样的字典: 示例 b

df.countries[0]
"[{'iso_3166_1': 'US', 'name': 'United States of America'}]"

或像这样的空列表: 示例 c

df.countries[505]
'[]'

我想做的是:

我试图集思广益,想出了这样的事情:

countryToRemove = "United States of America"
for index, row in df.iterrows():
    if countryToRemove in row['countries']:
        # row to be removed

但即使有其他国家,它也会删除其中包含美国的任何行。

编辑:我的数据框如下:

countries
0  [{'iso_3166_1': 'DE', 'name': 'Germany'}, {'is...
1  [{'iso_3166_1': 'US', 'name': 'United States o...
2                                                 []

标签: pythonpandaslistdictionarydata-structures

解决方案


如果你有这样的数据框:

                                           countries
0  [{'iso_3166_1': 'DE', 'name': 'Germany'}, {'is...
1  [{'iso_3166_1': 'US', 'name': 'United States o...
2                                                 []

然后您可以使用布尔索引来过滤掉您的数据框:

mask = df.countries.apply(
    lambda x: len(s := set(d["name"] for d in x)) == 1
    and s.pop() == "United States of America"
)
print(df[~mask])

印刷:

                                           countries
0  [{'iso_3166_1': 'DE', 'name': 'Germany'}, {'is...
2                                                 []

编辑:没有:=运营商的版本:

def fn(x):
    s = set(d["name"] for d in x)
    return len(s) == 1 and s.pop() == "United States of America"


mask = df.countries.apply(fn)
print(df[~mask])

推荐阅读