【问题标题】:Pandas groupby and sum to other dataframePandas groupby 和 sum 到其他数据框
【发布时间】:2019-04-09 00:08:09
【问题描述】:

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

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)

【问题讨论】:

    标签: python pandas dataframe group-by


    【解决方案1】:

    您应该尽量避免在循环中追加。这是低效的,不推荐。

    相反,您可以将数据帧连接成一个大数据帧,然后使用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 是一种 Pandas 方法,它允许您通过指定 indexcolumnsvaluesaggfunc(聚合函数)来创建 Excel 样式的数据透视表。

    【讨论】:

    • 你能简单地向我解释一下这个解决方案吗?
    • Pandas 在内存中效果最好。您可能必须使用 dask 或重构您正在尝试做的事情。
    【解决方案2】:

    另一种建议的方式,将分组、转置和行堆栈到数据帧。

    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'})
    

    Edited:为了概括,你需要把它放到函数中并循环。另外,一般情况下需要格式化索引(文件{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'})
    

    【讨论】:

    • 我将要附加数百个数据帧,因此需要一个 for 循环,而只有两个数据帧的解决方案是不够的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-10
    • 2020-01-20
    • 1970-01-01
    • 2019-09-29
    • 2020-07-12
    • 2021-12-19
    • 2017-03-16
    相关资源
    最近更新 更多