Python 按元素将n个数据帧聚合为单个数据帧

Python 按元素将n个数据帧聚合为单个数据帧,python,pandas,design-patterns,Python,Pandas,Design Patterns,使用聚合函数组合其他几个数据帧来生成熊猫数据帧的pythonic方法是什么?(数据帧都是具有相同标题的相同形状。) 我可能感兴趣的聚合函数是平均值、最小值、最大值和使用两个操作数的用户定义函数 例如,这是我生成数据帧(max)的方法,该数据帧具有来自其他四个数据帧(df1、df2、df3、df4)的最大元素。这并不是一个我可以在所有情况下应用的模式(习语),计算平均值看起来会有很大的不同 import pandas as pd df1 = pd.DataFrame({'a' : [1,2,3]

使用聚合函数组合其他几个数据帧来生成熊猫数据帧的pythonic方法是什么?(数据帧都是具有相同标题的相同形状。)

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

例如,这是我生成数据帧(
max
)的方法,该数据帧具有来自其他四个数据帧(
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

使用
pd.concat
将它们连接起来,然后使用
groupby
查找
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所述,
description
函数为您执行一些常规聚合:

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  

或者使用
description
而不是
max
谢谢。如何应用我自己的用户定义函数而不是max()?@T33C您可以使用
groupby.apply
函数,并将自定义函数传递给它。无法使用
apply
使用我的示例udf替换max,def myagg(a,b):返回a>b@T33C我假设您的实际函数除了查找最大值之外还执行其他操作。
apply
将把整个子数据帧传递给您的函数。因此,您需要重新编写函数来处理这个问题。执行
.groupby(level=0,axis=1)。应用(lambda x:print(x))
你就会明白我的意思了。