【问题标题】:Making a group in dataframe in pandas在熊猫的数据框中创建一个组
【发布时间】:2017-08-30 19:24:43
【问题描述】:

我有一个列表,例如

groups = [['Group1', 'A', 'B'], ['Group2', 'C', 'D']]

和一个数据框,例如

A 100
B 200
C 300
D 400

我想从上面的列表中做一个组和成为:

Group 1 300
Group 2 700

如何使用 python pandas 做到这一点? 不用说我是熊猫的新手。谢谢。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    您需要通过lists 创建dict,然后创建groupby 并聚合sum

    df = pd.DataFrame({'a': ['A', 'B', 'C', 'D'], 'b': [100, 200, 300, 400]})
    print (df)
       a    b
    0  A  100
    1  B  200
    2  C  300
    3  D  400
    
    groups = [['Group1', 'A', 'B'], ['Group2', 'C', 'D']]
    
    #http://stackoverflow.com/q/43227103/2901002
    d = {k:row[0] for row in groups for k in row[1:]}
    print (d)
    {'B': 'Group1', 'C': 'Group2', 'D': 'Group2', 'A': 'Group1'}
    
    print (df.set_index('a').groupby(d).sum())
              b
    Group1  300
    Group2  700
    

    可以稍微修改解决方案 - 如果只有列 bsum 聚合。最后reset_index 用于将索引转换为列。

    df1 = df.set_index('a').groupby(pd.Series(d, name='a'))['b'].sum().reset_index()
    print (df1)
            a    b
    0  Group1  300
    1  Group2  700
    
    df2 = df.groupby(df['a'].map(d))['b'].sum().reset_index()
    print (df2)
            a    b
    0  Group1  300
    1  Group2  700
    

    【讨论】:

      【解决方案2】:

      另一种选择......但似乎@jezrael 的方式更好!

      import pandas as pd
      
      groups = [['Group1', 'A', 'B'], ['Group2', 'C', 'D']]
      
      df0 = pd.melt(pd.DataFrame(groups).set_index(0).T)
      df1 = pd.read_clipboard(header=None)  # Your example data
      
      df = df1.merge(df0, left_on=0, right_on='value')[['0_y', 1]]
      df.columns = ['Group', 'Value']
      
      print df.groupby('Group').sum()
      
      
              Value
      Group        
      Group1    300
      Group2    700
      

      【讨论】:

        【解决方案3】:

        使用 python 3 解包和理解来创建字典。在第一列的地图中使用该字典。使用该映射进行分组。

        考虑列表列表groups 和数据框df

        groups = [['Group1', 'A', 'B'], ['Group2', 'C', 'D']]
        df = pd.DataFrame(dict(a=list('ABCD'), b=range(100, 401, 100)))
        

        然后:

        df.groupby(df.a.map({k: g for g, *c in groups for k in c})).sum()
        
                  b
        a          
        Group1  300
        Group2  700
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-11-12
          • 1970-01-01
          • 1970-01-01
          • 2017-09-01
          • 2014-05-22
          • 2018-11-04
          • 2022-09-24
          • 1970-01-01
          相关资源
          最近更新 更多