【问题标题】:Group pandas df according to set根据集合对 pandas df 进行分组
【发布时间】:2014-09-02 04:45:15
【问题描述】:

我想知道是否有更快的方法来根据集合进行分组。操作如下:

import pandas as pd
col1 = 'ABCDE'
col2 = range(5,10)
df = pd.DataFrame(zip(col1,col2), columns=('x','y'))

row_groups = {'foo':set('ABC'), 'bar':set('DE')}

我想改变当前形式的数据框:

    x    y                     y
0   A    5         group_name
1   B    6         foo         18
2   C    7  ==>    bar         17 
3   D    8
4   E    9

我这样做的方法是创建代表组的第二个数据框,合并两个数据框,按行组名称分组,然后求和,

row_groups_df = pd.DataFrame(zip('ABCDE',['foo']*3 + ['bar']*2), 
                             columns=('x','group_name'))
merged_df = pd.merge(df, row_groups_df)
output_df = merged_df.groupby(['group_name']).sum()

产生所需的输出:

            y
group_name  
bar        17
foo        18

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    我不知道这是否是最好的方法,但你可以这样做:

    df.groupby('x', axis = 0).sum()\
      .groupby(lambda x: (k for k,v in row_groups.iteritems() if x in v).next()).sum()
    

    或将df.groupby('x', axis = 0).sum() 替换为df.set_index('x')

    df.set_index('x').\
       groupby(lambda x: (k for k,v in row_groups.iteritems() if x in v).next()).sum()
    

    按要求输出:

          y
    bar  17
    foo  18
    

    【讨论】:

      猜你喜欢
      • 2019-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-07
      • 2017-10-09
      相关资源
      最近更新 更多