微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在python中反转多索引数据透视表

如何解决如何在python中反转多索引数据透视表

我有一个数据框,可以将其转换为数据透视表,对缺失的数据执行一些估算,然后将其转换回原始形式。我似乎可以正常工作的代码不会产生错误,但是输出不会产生预期的行数。我怀疑问题与指定熔化/堆叠有关,但还不太清楚。如果有人能够提供一些帮助/支持,我将不胜感激。图片代码和更多信息如下。

在此先感谢所有提供帮助的人。

初始数据帧(数据)包含4列(地理代码/国家/地区,变量名称,年份和值)。有290,038行x 4列。

enter image description here

我将data转换为以下格式(每行中的国家/地区年份对,每列都是变量)。使用以下代码

data_temp = data.copy()

data_temp_grouped = pd.pivot_table(data_temp,index=(['geocode','year']),columns="variablename",values="value")

enter image description here

执行一些操作/输入后,我想将data_temp_grouped转换回原始格式为data。我尝试了几种不同的方法代码未产生预期的行数(290,038)。

这将产生4列,但有827,929行。

data_temp_grouped2 = data_temp_grouped.copy()

data_temp_grouped3 = data_temp_grouped2.stack(0).reset_index(name='value')

enter image description here

这将产生111,5712行x 4列

data_temp_grouped2 = data_temp_grouped2.copy()

data_temp_grouped4 = data_temp_grouped4.reset_index()

data_temp_grouped4 = pd.melt(data_temp_grouped4,id_vars=["geocode","year"])

data_temp_grouped4

解决方法

TLDR:我无法解释宽幅格式中“丢失”的数据,而该数据已“添加”到长格式​​中。

我刚刚意识到为什么会有这些问题。在最初的长格式中,共有290,000行。转换为宽格式时,有7748(行)x144(列)。将其压缩为长格式后,总共有1,115,712行(7748 x 144)。出现这种增加的原因是,在初始数据中不存在缺少的数据(某些变量的年份/年份对),而在转换为宽格式时仅“出现”了。从长到宽再次恢复尺寸匹配:7748 x 144,符合预期。

对于其他可能遇到相同问题的人,我也在下面提供了我的代码。 代码在下面

# grouping country year pairs
data_temp = data.copy()
# converts into multi indexed wide format (country year pairs)
data_temp_grouped = pd.pivot_table(data_temp,index=(['geocode','year']),columns="variablename",values="value")

# linearly  interpolates the data for each country year pair
data_temp_grouped=data_temp_grouped.groupby("geocode").apply(lambda x : x.interpolate(method="linear",limit_direction="both"))

# Make a copy of the dataframe
data_temp_grouped2 = data_temp_grouped.copy()

# reset the index
data_temp_grouped2=data_temp_grouped2.reset_index()
data_temp_grouped2_melted=pd.melt(data_temp_grouped2,id_vars=['geocode',"year"],var_name='variablename',value_name='value')
data_temp_grouped2_melted

# to double check and convert back to multi index wide format
data_temp_grouped_check = pd.pivot_table(data_temp_grouped2_melted,values="value")

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。