簡體   English   中英

如果列值在分組子集中都相等,則刪除行條目

[英]Drop rows entries if a column values are all equal in grouped subset

我有這個例子 df:

info = {'name': ['Jason', 'Jason', 'Jason', 'Jason','Molly', 'Molly', 'Molly', 'Molly','Nicky', 'Nicky', 'Nicky', 'Nicky'], 
'city': ['Las Vegas', 'New York', 'Dallas', 'Los Angeles','Las Vegas', 'New York', 'Dallas', 'Los Angeles','Las Vegas', 'New York', 'Dallas', 'Los Angeles'],
'Visits' :[2,2,2,2,1,3,4,1,2,8,2,8]}
df = pd.DataFrame(data=info)
df

給出:

    name    city        Visits
0   Jason   Las Vegas     2
1   Jason   New York      2
2   Jason   Dallas        2
3   Jason   Los Angeles   2
4   Molly   Las Vegas     1
5   Molly   New York      3
6   Molly   Dallas        4
7   Molly   Los Angeles   1
8   Nicky   Las Vegas     2
9   Nicky   New York      8
10  Nicky   Dallas        2
11  Nicky   Los Angeles   8

如果Visits下的所有值都相等,我想從names中刪除條目,這在df['name']== jason的情況下是正確的。 我使用了兩個子集name and Visits的 drop_duplicates,但 output 也刪除了其他名稱下的其他重復值。

df.drop_duplicates(['name','Visits'], keep=False)

這給出:

    name    city     Visits
5   Molly   New York    3
6   Molly   Dallas      4

output 應該是:

4   Molly   Las Vegas     1
5   Molly   New York      3
6   Molly   Dallas        4
7   Molly   Los Angeles   1
8   Nicky   Las Vegas     2
9   Nicky   New York      8
10  Nicky   Dallas        2
11  Nicky   Los Angeles   8

實現這一目標的最佳方法是什么?

使用nunique

df = df[df.groupby('name')['Visits'].transform('nunique').ne(1)]

或者

df = df.groupby('name').filter(lambda x: x['Visits'].nunique() != 1)

Output:

>>> df
     name         city  Visits
4   Molly    Las Vegas       1
5   Molly     New York       3
6   Molly       Dallas       4
7   Molly  Los Angeles       1
8   Nicky    Las Vegas       2
9   Nicky     New York       8
10  Nicky       Dallas       2
11  Nicky  Los Angeles       8

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM