熊猫分组并求和到其他数据帧

时间:2018-11-05 15:48:00

标签: python pandas dataframe group-by

我有一本字典,其中key是文件名,值是如下所示的数据框:

col1     col2
A        10
B        20
A        20 
A        10
B        10

我想基于'col1'进行分组,将'col2'中的值求和并将其存储到新的数据帧'df'中,其输出应类似于:

输出应如下所示:

Index    A      B  
file1     40     30
file2     50     35

我的代码:

df=pd.DataFrame(columns=['A','B'])
for key, value in data.items():

    cnt=(value.groupby('Type')['Packets'].sum())
    print(cnt)

    df.append(cnt,ignore_index=True)

2 个答案:

答案 0 :(得分:0)

您应尽量避免附加循环。这效率低下,不建议这样做。

相反,您可以将数据帧连接为一个大数据帧,然后使用pivot_table

# aggregate values in your dictionary, adding a "file" series
df_comb = pd.concat((v.assign(file=k) for k, v in data.items()), ignore_index=True)

# perform 'sum' aggregation, specifying index, columns & values
df = df_comb.pivot_table(index='file', columns='col1', values='col2', aggfunc='sum')

说明

  • v.assign(file=k)向每个数据框添加一系列file,其值设置为文件名。
  • pd.concat连接字典中的所有数据框。
  • pd.DataFrame.pivot_table是一种Pa​​ndas方法,允许您通过指定indexcolumnsvaluesaggfunc(聚合函数)来创建Excel样式的数据透视表)。

答案 1 :(得分:0)

另一种建议的方式是将分组方式,转置方式和行堆栈集成到数据框中。

import pandas as pd
import numpy as np

df_1 = pd.DataFrame({'col1':['A', 'B', 'A', 'A', 'B'], 'col2':[10, 20, 20, 10, 10]})
df_2 = pd.DataFrame({'col1':['A', 'B', 'A', 'A', 'B'], 'col2':[30, 10, 15, 5, 25]})
df_1_agg = df_1.groupby(['col1']).agg({'col2':'sum'}).T.values
df_2_agg = df_2.groupby(['col1']).agg({'col2':'sum'}).T.values
pd.DataFrame(np.row_stack((df_1_agg, df_2_agg)), index = ['file1', 'file2']).rename(columns = {0:'A', 1:'B'})

enter image description here

已编辑:要概括起见,您需要将其放入函数中并遍历。另外,在一般情况下,需要格式化索引(文件{i})。

lst_df = [df_1, df_2]

df_all = []

for i in lst_df:
    # iterate every data faame
    df_agg = i.groupby(['col1']).agg({'col2':'sum'}).T.values

    # append to the accumulator
    df_all.append(df_agg)

pd.DataFrame(np.row_stack(df_all), index = ['file1', 'file2']).rename(columns = {0:'A', 1:'B'})