将n个DataFrame聚合到单个DataFrame中 - 以元素方式

时间:2017-11-14 23:39:02

标签: python pandas design-patterns

使用聚合函数生成pandas DataFrame以组合其他几个DataFrame的pythonic方法是什么? (DataFrames具有相同的标题,具有相同的标题。)

我可能感兴趣的聚合函数是使用两个操作数的均值,最小值,最大值和用户定义的函数。

例如,这是我生成DataFrame(max)的方式,该数据框具有来自其他四个DataFrame(df1,df2,df3,df4)的最大元素。这几乎不是我可以在所有情况下应用的模式(习语),并且计算平均值看起来会有很大不同。

import pandas as pd

df1 = pd.DataFrame({'a' : [1,2,3], 'b': [3,9,5]})
df2 = pd.DataFrame({'a' : [6,2,7], 'b': [3,4,5]})
df3 = pd.DataFrame({'a' : [6,2,11], 'b': [3,4,5]})
df4 = pd.DataFrame({'a' : [6,2,7], 'b': [3,12,5]})
print(df1)
print(df2)
print(df3)
print(df4)

max1 = df1.where(df1 > df2, df2)
max2 = df3.where(df3 > df4, df4)
max = max1.where(max1 > max2, max2)
print(max)

用户定义函数的一个示例,它采用我想要应用的两个操作数,以下与本例中的max基本相同,但在实践中会更复杂

def myagg(a, b):
    return a > b

1 个答案:

答案 0 :(得分:2)

将它们全部与pd.concatgroupby连接,以找到max

pd.concat([df1, df2, df3, df4], 1).groupby(level=0, axis=1).max()

    a   b
0   6   3
1   2  12
2  11   5

将此与您返回的方法进行比较:

max

    a   b
0   6   3
1   2  12
2  11   5

请注意,每个数据框的列名必须与此(以及当前方法)相同才能生效。

正如piR所提到的,describe函数会为您执行一些常规聚合:

lodf = [df1, df2, df3, df4]

pd.concat(lodf, keys=range(len(lodf))) \
  .groupby(level=1).describe().swaplevel(0, 1, 1).sort_index(1)

    25%       50%       75%       count        max        mean        min  \
      a    b    a    b    a     b     a    b     a     b     a     b    a   
0  4.75  3.0  6.0  3.0  6.0  3.00   4.0  4.0   6.0   3.0  4.75  3.00  1.0   
1  2.00  4.0  2.0  6.5  2.0  9.75   4.0  4.0   2.0  12.0  2.00  7.25  2.0   
2  6.00  5.0  7.0  5.0  8.0  5.00   4.0  4.0  11.0   5.0  7.00  5.00  3.0   

             std            
     b         a         b  
0  3.0  2.500000  0.000000  
1  4.0  0.000000  3.947573  
2  5.0  3.265986  0.000000