python - الباندا التجميعية مع أسماء الأعمدة الحيوية




pandas aggregate (4)

لديّ برنامج نصي يُنشئ إطار بيانات الباندا مع عدد متباين من أعمدة القيمة. كمثال ، قد يكون هذا مدافع

import pandas as pd
df = pd.DataFrame({
'group': ['A', 'A', 'A', 'B', 'B'],
'group_color' : ['green', 'green', 'green', 'blue', 'blue'],
'val1': [5, 2, 3, 4, 5], 
'val2' : [4, 2, 8, 5, 7]
})

  group group_color  val1  val2
0     A       green     5     4
1     A       green     2     2
2     A       green     3     8
3     B        blue     4     5
4     B        blue     5     7

هدفي هو الحصول على المتوسط ​​المجمع لكل عمود من أعمدة القيمة. في هذه الحالة المحددة (مع أعمدة القيمة 2) ، يمكنني استخدام

df.groupby('group').agg({"group_color": "first", "val1": "mean", "val2": "mean"})

      group_color      val1      val2
group                                
A           green  3.333333  4.666667
B            blue  4.500000  6.000000

لكن هذا لا يعمل عندما يكون لإطار البيانات المعني أعمدة قيمة أكبر (val3 ، val4 ، إلخ). هل هناك طريقة لاتخاذ ديناميكي يعني "جميع الأعمدة الأخرى" أو "جميع الأعمدة التي تحتوي على فال في أسمائهم"؟


أكثر سهولة مثل

df.groupby('group').agg(lambda x : x.head(1) if x.dtype=='object' else x.mean())
Out[63]: 
      group_color      val1      val2
group                                
A           green  3.333333  4.666667
B            blue  4.500000  6.000000

إذا كان group_color الخاص بك هو نفسه دائمًا داخل مجموعة واحدة ، فيمكنك القيام بما يلي:

df.pivot_table(index=['group','group_color'],aggfunc='mean')

انتاج:

                       val1      val2
group group_color                    
A     green        3.333333  4.666667
B     blue         4.500000  6.000000

في الحالة الأخرى ، يمكنك إنشاء القاموس وتمريره إلى agg :

agg_dict = {f: 'first' if f=='group_color' else 'mean' for f in df.columns[1:]}
df.groupby('group').agg(agg_dict)

التي الإخراج:

      group_color      val1      val2
group                                
A           green  3.333333  4.666667
B            blue  4.500000  6.000000

لكل تعليق OP

يمكننا التجميع حسب 'group' و 'group_color' دون المخاطرة بوجود أكثر من 'group_color' فريدة من نوعها 'group_color' لكل 'group'

بناء على ذلك:

df.groupby(['group', 'group_color']).mean().reset_index(level=1)

      group_color      val1      val2
group                                
A           green  3.333333  4.666667
B            blue  4.500000  6.000000

يمكنك الذهاب مع 2 القواميس التي يمكنك الجمع بين مثل هذا:

df.groupby('group').agg({**{'group_color': 'first'}, **{c: 'mean' for c in df.columns if c.startswith('val')}})

في هذه الحالة ، يكون لديك dict واحد يحتوي على مجموعات ثابتة والأخرى مع تحديد العمود الديناميكي.





pandas-groupby