Lọc DataFrame trên các nhóm có số phần tử khác nhau hơn 1


10

Tôi đang làm việc với DataFrame có cấu trúc sau:

import pandas as pd

df = pd.DataFrame({'group':[1,1,1,2,2,2,2,3,3,3],
                   'brand':['A','B','X','C','D','X','X','E','F','X']})

print(df)

   group brand
0      1     A
1      1     B
2      1     X
3      2     C
4      2     D
5      2     X
6      2     X
7      3     E
8      3     F
9      3     X

Mục tiêu của tôi là chỉ xem các nhóm có chính xác một thương hiệu Xliên quan đến họ. Vì nhóm số 2 có hai quan sát bằng với thương hiệu X, nên nó được lọc ra khỏi DataFrame kết quả.

Đầu ra sẽ trông như thế này:

   group brand
0      1     A
1      1     B
2      1     X
3      3     E
4      3     F
5      3     X

Tôi biết tôi nên thực hiện một groupbycột trên cột và sau đó lọc các nhóm đó có số lượng Xkhác nhau 1. Phần lọc là nơi tôi đấu tranh. Bất kỳ trợ giúp sẽ được đánh giá cao.

Câu trả lời:


10

Sử dụng series.eqđể kiểm tra xem brandcó bằng X, sau đó transform sumnhóm và nhóm lọc trong đó Xsố đếm bằng 1:

df[df['brand'].eq('X').groupby(df['group']).transform('sum').eq(1)]

   group brand
0      1     A
1      1     B
2      1     X
7      3     E
8      3     F
9      3     X

8

Điều này cũng nên làm việc

df[df.groupby(['group'])['brand'].transform('sum').str.count('X').eq(1)]

Đầu ra

 group  brand
0   1   A
1   1   B
2   1   X
7   3   E
8   3   F
9   3   X

6

Cột nhóm và áp dụng bộ lọc đơn giản về số lượng 'X'ký tự trong nhóm bằng 1

df.groupby('group').filter(lambda x: x['brand'].str.count('X').sum() == 1)

Đầu ra

   group brand
0      1     A
1      1     B
2      1     X
7      3     E
8      3     F
9      3     X

3

Giải pháp với pd.crosstab

df[df['group'].map(pd.crosstab(df['group'],df['brand'])['X'].eq(1))]

#   group brand
#0      1     A
#1      1     B
#2      1     X
#7      3     E
#8      3     F
#9      3     X

Chúng tôi cũng có thể sử dụng DataFrame.mergevớiSeries.drop_duplicates

df.merge(df.loc[df.brand.eq('X'),'group'].drop_duplicates(keep = False),on='group')
#   group brand
#0      1     A
#1      1     B
#2      1     X
#3      3     E
#4      3     F
#5      3     X
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.