2 ответа
Согласно вашей логике, похоже, вы хотите удалить столбцы, где:
quantity
{{x1}} = & gt; {{x2}} и'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
.
Ты можешь использовать:
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