डेटाफ़्रेम को उन समूहों पर फ़िल्टर करना जहां तत्व की गिनती 1 से भिन्न है


10

मैं निम्नलिखित संरचना वाले DataFrame के साथ काम कर रहा हूं:

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

मेरा लक्ष्य केवल उन समूहों को देखना है जिनके पास एक ब्रांड Xहै। चूंकि समूह संख्या 2 में ब्रांड के बराबर दो अवलोकन हैं X, इसे परिणामी डेटाफ़्रेम से फ़िल्टर किया जाना चाहिए।

आउटपुट इस तरह दिखना चाहिए:

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

मुझे पता है कि मुझे groupbyसमूह कॉलम पर करना चाहिए और फिर उन समूहों को फ़िल्टर करना चाहिए जिनकी संख्या X1. से अधिक है। फ़िल्टरिंग भाग वह है जहां मैं संघर्ष करता हूं। किसी भी सहायता की सराहना की जाएगी।

जवाबों:


10

series.eqअगर brandबराबर है X, तो यह जांचने के लिए उपयोग करें कि transform sumसमूह और और फिल्टर समूह जिसमें Xगिनती 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

यह भी काम करना चाहिए

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

उत्पादन

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

6

Groupby कॉलम और 'X'1 के बराबर समूह में वर्ण की गिनती का एक साधारण फ़िल्टर लागू करें

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

उत्पादन

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

3

के साथ समाधान 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

हम भी DataFrame.mergeसाथ उपयोग कर सकते हैंSeries.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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.