使用 pandas 透视多个表
Pivot over multiple tables with pandas
我想创建一个具有多个表平均值的数据透视表。这是我要创建的示例:输入是 df1
和 df2
,res
是我要从 df1
和 df2
[= 计算的结果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
中。我想计算每组州 A
、B
.
按年计算的平均值
我没有实现计算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)
我想创建一个具有多个表平均值的数据透视表。这是我要创建的示例:输入是 df1
和 df2
,res
是我要从 df1
和 df2
[= 计算的结果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
中。我想计算每组州 A
、B
.
我没有实现计算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)