使用 pandas 透视多个表

Pivot over multiple tables with pandas

我想创建一个具有多个表平均值的数据透视表。这是我要创建的示例:输入是 df1df2res 是我要从 df1df2[= 计算的结果22=]

import pandas as pd
import numpy as np

df1 = pd.DataFrame({"2000": ["A", "A", "B"],
                   "2001": ["A", "B", "B"],
                   "2002": ["B", "B", "B"]},
                   index =['Item1', 'Item2', 'Item3'])

df2 = pd.DataFrame({"2000": [0.5, 0.7, 0.1],
                   "2001": [0.6, 0.6, 0.3],
                   "2002": [0.7, 0.4, 0.2]},
                   index =['Item1', 'Item2', 'Item3'])

display(df1)
display(df2)

res = pd.DataFrame({"2000": [0.6, 0.1],
                   "2001": [0.6, 0.45], 
                   "2002": [np.nan, 0.43]},
                   index =['A', 'B'])

display(res)

两个数据框的列中都有年份。每行是一个项目。项目随时间改变状态。状态在 df1 中定义。它们每年也有值,定义在 df2 中。我想计算每组州 AB.

按年计算的平均值

我没有实现计算res,有什么建议吗?

要解决这个问题,你应该首先将两个数据帧合并为一个。例如,您可以使用此代码将数据帧从宽转换为长,然后通过索引(年份、项目)合并它们,最后重置索引以用作数据透视表中的列:

df_full = pd.concat([df1.unstack(), df2.unstack()], axis=1).reset_index()

然后,如果需要,您可以重命名列以构建清晰的数据透视表:


df_full = df_full.rename(columns={'level_0': 'year', 'level_1': 'item', 0: 'DF1', 1:'DF2'})

最后建立一个支点table。

res_out = pd.pivot_table(data=df_full, index='DF1', columns='year', values='DF2', aggfunc='mean')

这不是一种单行解决方案,但它确实有效。

df_full = pd.concat([df1.unstack(), df2.unstack()], axis=1).reset_index()
df_full = df_full.rename(columns={'level_0': 'year', 'level_1': 'item', 0: 'DF1', 1:'DF2'})
res_out = pd.pivot_table(data=df_full, index='DF1', columns='year', values='DF2', aggfunc='mean')
display(res_out)

这段使用堆栈、连接和取消堆栈的代码应该可以工作:

df1_long = df1.stack().to_frame().rename({0:'category'}, axis=1)
df2_long = df2.stack().to_frame().rename({0:'values'}, axis=1)
joined_data = df1_long.join(df2_long).reset_index().rename({'level_0':'item','level_1':'year'}, axis=1)
res = joined_data.groupby(['category', 'year']).mean().unstack()

display(res)