Python: как найти, какие значения в столбце имеют значения NaN в другом конкретном столбце (фреймы данных) - PullRequest
0 голосов
/ 25 ноября 2018

Предположим, у нас есть 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,но я не хочу, чтобы один и тот же partner указывался дважды.

Поэтому мой предпочтительный результат будет выглядеть так:

commodity_nan_partners=
Afghanistan
Canada
USA

, а не:

Afghanistan
Afghanistan
Canada
Canada
USA

Ответы [ 5 ]

0 голосов
/ 25 ноября 2018

Просто еще одна альтернатива:

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

Использование loc + np.isnan

>>> df1.loc[np.isnan(df1.commodity), 'partner'].drop_duplicates()
0    Afghanistan
4         Canada
7            USA
Name: partner, dtype: object
0 голосов
/ 25 ноября 2018

Можно проверить с dropna, просто предоставьте другую идею здесь.

set(df1.partner.tolist())-set(df1.dropna().partner.tolist())
Out[94]: {'Afghanistan', 'Canada', 'USA'}
0 голосов
/ 25 ноября 2018

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
0 голосов
/ 25 ноября 2018

Шаг 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()
0 голосов
/ 25 ноября 2018

Вы можете искать NaN значения с помощью isnull, а затем получать уникальные значения с помощью unique или set:

>>> 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...