উপাদানগুলির সংখ্যা 1 এর চেয়ে আলাদা এমন গোষ্ঠীতে ডেটাফ্রেম ফিল্টার করা


10

আমি নিম্নলিখিত স্ট্রাকচারযুক্ত ডেটাফ্রেমে কাজ করছি:

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 টির চেয়ে আলাদা গণনা করা ফিল্টার করব filter ফিল্টারিং অংশটি যেখানে আমি লড়াই করছি। কোন সাহায্য প্রশংসা করা হবে।

উত্তর:


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

গ্রুপবাই কলাম এবং '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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.