Учитывая следующий тестовый набор данных:

   id city district  quantity  price
0   1   bj       hd      12.0   23.0
1   2   bj       cy      23.0   45.0
2   3   bj       hd       NaN    NaN
3   4   bj       cy       NaN    NaN
4   5   sh       hp      12.0    NaN
5   6   sh       hp       NaN    NaN
6   7   sh       pd       NaN    NaN

Я хотел бы удалить повторяющиеся строки на основе city и district, а затем удалить строки, если его quantity равно NaN, но если city и {{X5} } не дублируются, то даже если quantity равно NaN, нет необходимости отбрасывать строки.

Код на основе ссылки с python python-3.x pandas dataframe

-1
ahbon 18 Янв 2021 в 12:15

2 ответа

Лучший ответ

Согласно вашей логике, похоже, вы хотите удалить столбцы, где:

  1. quantity {{x1}} = & gt; {{x2}} и
  2. 'city', 'district' равно duplicated => m2 = df[['city', 'district']].duplicated(keep=False)

И поскольку вы хотели бы взять все столбцы, за исключением которых соответствуют вышеуказанным условиям:

>>> m1 = df['quantity'].isna()
>>> m2 = df[['city', 'district']].duplicated(keep=False)
>>> df[~(m1 & m2)]

   id city district  quantity  price
0   1   bj       hd      12.0   23.0
1   2   bj       cy      23.0   45.0
4   5   sh       hp      12.0    NaN
6   7   sh       pd       NaN    NaN

И ваш исходный код будет работать с операторами keep=False и | (или).

>>> m1 = df['quantity'].notna()
>>> m2 = ~df[['city', 'district']].duplicated(keep=False)
>>> df[m1 | m2]
   id city district  quantity  price
0   1   bj       hd      12.0   23.0
1   2   bj       cy      23.0   45.0
4   5   sh       hp      12.0    NaN
6   7   sh       pd       NaN    NaN

ИЗМЕНИТЬ

На основании ваших комментариев, если DF:

>>> df
   id city district  quantity  price
0   1   bj       hd      12.0   23.0
1   2   bj       cy      23.0   45.0
2   3   bj       hd       NaN    NaN
3   4   bj       cy       NaN    NaN
4   8   sh       hp      14.0   15.0
5   8   sh       hp      14.0   16.0
6   7   sh       pd       NaN    NaN

# First drop duplicates with NaN items, with any of the above methods
>>> df[m1 | m2]
   id city district  quantity  price
0   1   bj       hd      12.0   23.0
1   2   bj       cy      23.0   45.0
4   8   sh       hp      14.0   15.0
5   8   sh       hp      14.0   16.0
6   7   sh       pd       NaN    NaN

# then drop duplicates with default condition:
>>> df[m1 | m2].drop_duplicates(['city', 'district'])
   id city district  quantity  price
0   1   bj       hd      12.0   23.0
1   2   bj       cy      23.0   45.0
4   8   sh       hp      14.0   15.0
6   7   sh       pd       NaN    NaN

Вы можете изменить параметр keep для drop_duplicates, чтобы управлять поведением по умолчанию, т.е. сохранять ли дубликат first или last.

1
Sayandip Dutta 18 Янв 2021 в 09:49

Ты можешь использовать:

m1 = df['quantity'].notna()
m2 = ~df[['city', 'district']].duplicated()
m3 = ~df[['city', 'district']].duplicated(keep=False)

df1 = df[(m1 & m2) | (~m1 & m3)]
print(df1)
   id city district  quantity  price
0   1   bj       hd      12.0   23.0
1   2   bj       cy      23.0   45.0
4   5   sh       hp      12.0    NaN
6   7   sh       pd       NaN    NaN
1
jezrael 18 Янв 2021 в 09:23
65771633