Python:如何查找一列中的哪些值在另一特定列(数据框)中具有NaN值

时间:2018-11-25 02:20:10

标签: python pandas dataframe multiple-columns nan

假设我们有df1像这样:

x1 = [{'partner': "Afghanistan", 'commodity': NaN}, 
      {'partner': "Zambia",      'commodity': 2}, 
      {'partner': "Germany",     'commodity': 2},
      {'partner': "Afghanistan", 'commodity': NaN},
      {'partner': "Canada",      'commodity': NaN},
      {'partner': "Italy",       'commodity': 3},
      {'partner': "Canada",      'commodity': NaN},
      {'partner': "USA",         'commodity': NaN}]

df1 = pd.DataFrame(x1)

我想做的是查看partner中具有NaN中的commodity值的值列表,但是我不想拥有相同的{{1} }列出两次。

所以我的首选结果如下:

partner

而不是:

commodity_nan_partners=
Afghanistan
Canada
USA

5 个答案:

答案 0 :(得分:3)

您可以使用NaN查找isnull值,然后使用uniqueset获得唯一值:

>>> pd.Series(df1.loc[df1.commodity.isnull(),'partner'].unique())
0    Afghanistan
1         Canada
2            USA
dtype: object

# or
>>> pd.Series(list(set(df1.loc[df1.commodity.isnull(),'partner'])))
0         Canada
1    Afghanistan
2            USA
dtype: object

答案 1 :(得分:3)

loc + isnull + drop_duplicates

您可以过滤您的系列,然后删除重复项:

res = df1.loc[df1['commodity'].isnull(), 'partner'].drop_duplicates()

print(res)

0    Afghanistan
4         Canada
7            USA
Name: partner, dtype: object

答案 2 :(得分:2)

第1步
筛选出仅保留有效字符串:

v = df1.loc[df1.commodity.isna(), 'partner']

或者,

v = df1.partner[df1.commodity.isna()]

print(v)
0    Afghanistan
3    Afghanistan
4         Canada
6         Canada
7            USA
Name: partner, dtype: object

第2步
删除重复项。

如果要收藏,

ingredients.unique()
array(['Afghanistan', 'Canada', 'USA'], dtype=object)

或者,

set(ingredients)
{'Afghanistan', 'Canada', 'USA'}

如果您想要一个系列,

ser = ingredients.drop_duplicates().reset_index(drop=True)

0    Afghanistan
1         Canada
2            USA
Name: partner, dtype: object

如果您想要一个DataFrame,

df = ser.to_frame()

答案 3 :(得分:2)

可以使用dropna进行检查,只需在此处提供其他想法即可。

set(df1.partner.tolist())-set(df1.dropna().partner.tolist())
Out[94]: {'Afghanistan', 'Canada', 'USA'}

答案 4 :(得分:0)

还有另一种选择:

switch

使用Permissions + >>> df1[df1.isnull().any(axis=1)]['partner'].drop_duplicates() 0 Afghanistan 4 Canada 7 USA Name: partner, dtype: object

loc