使用聚合函数组合其他几个 DataFrame 来生成 pandas DataFrame 的 pythonic 方法是什么? (DataFrame 的形状均相同, header 也相同。)
我可能感兴趣的聚合函数是平均值、最小值、最大值和采用两个操作数的用户定义函数。
例如,这是我生成一个 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
最佳答案
用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 提到的,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
关于python - 将 n 个 DataFrame 按元素聚合为单个 DataFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47297104/