gpt4 book ai didi

具有重复列类别的 Pandas 数据透视表

转载 作者:行者123 更新时间:2023-12-05 01:25:55 25 4
gpt4 key购买 nike

我有一个如下所示的数据框:

df = pd.DataFrame({"Object": ['Apple', 'Orange', 'Banana', 'Grape', 'Cherry'], 
"Jan 01 Vol": [0, 5, 2, 4, 8],
"Jan 01 Price": [1.15, 2.30, 1.75, 3.4, 2.5],
"Jan 01 Sales": [0, 11.5, 5.25, 13.6, 20],
"Jan 02 Vol": [1, 2, 3, 4, 5],
"Jan 02 Price": [1.15, 2.30, 1.75, 3.4, 2.5],
"Jan 02 Sales": [1.15, 4.6, 5.25, 13.6, 12.5],
"Feb 01 Vol": [5, 4, 3, 2, 1],
"Feb 01 Price": [1.15, 2.30, 1.75, 3.4, 2.5],
"Feb 01 Sales": [5.75, 9.2, 5.25, 6.8, 2.5],})

我希望能够操作数据框,使“Vol”、“Price”、“Sales”成为它们自己的列,同时垂直旋转列的日期方面,使其看起来像这样:

df2 = pd.DataFrame({"Object": ['Apple', 'Apple', 'Apple', 
'Orange','Orange', 'Orange',
'Banana', 'Banana', 'Banana',
'Grape', 'Grape', 'Grape',
'Cherry', 'Cherry', 'Cherry'],
"Year": [2001, 2001, 2002,
2001, 2001, 2002,
2001, 2001, 2002,
2001, 2001, 2002,
2001, 2001, 2002],
"Month": [1, 2, 1,
1, 2, 1,
1, 2, 1,
1, 2, 1,
1, 2, 1],
"Vol": [0, 5, 1, 5, 4, 2, 2, 3, 3, 4, 2, 4, 8, 1, 5],
"Price": [1.15, 1.15, 1.15, 2.30, 2.30, 2.30, 1.75, 1.75, 1.75, 3.4, 3.4, 3.4, 2.5, 2.5, 2.5],
"Sales": [0, 5.75, 1.15, 11.50, 9.2, 4.6, 5.25, 5.25, 5.25, 13.60, 6.8, 13.60, 20, 2.5, 12.5]})

我考虑过使用 lambda 函数创建一个新列,从水平列名称中提取年份,但这不起作用,因为数组长度不同。我还考虑过制作数据透视表,但同样,不确定如何将列的“Vol”、“Price”、“Sales”方面解析为自己的列。任何帮助将不胜感激。

最佳答案

dfm = df.melt(id_vars='Object')

df3 = pd.concat([dfm[['Object', 'value']], dfm['variable'].str.split(expand=True)], axis=1)
df3.rename(columns={0: 'Month', 1: 'Year', 2:'Type'}, inplace=True)
df3 = df3.set_index(['Object', 'Year', 'Month', 'Type']).unstack()['value'].reset_index()
df3['Year'] = df3['Year'].astype(int)+2000
df3['Month'] = pd.to_datetime(df3['Month'], format='%b').dt.month

#Output
#Type Object Year Month Price Sales Vol
#0 Apple 2001 2 1.15 5.75 5.0
#1 Apple 2001 1 1.15 0.00 0.0
#2 Apple 2002 1 1.15 1.15 1.0
#3 Banana 2001 2 1.75 5.25 3.0
#4 Banana 2001 1 1.75 5.25 2.0
#5 Banana 2002 1 1.75 5.25 3.0
#6 Cherry 2001 2 2.50 2.50 1.0
#7 Cherry 2001 1 2.50 20.00 8.0
#8 Cherry 2002 1 2.50 12.50 5.0
#9 Grape 2001 2 3.40 6.80 2.0
#10 Grape 2001 1 3.40 13.60 4.0
#11 Grape 2002 1 3.40 13.60 4.0
#12 Orange 2001 2 2.30 9.20 4.0
#13 Orange 2001 1 2.30 11.50 5.0
#14 Orange 2002 1 2.30 4.60 2.0

我首先会使用pd.melt进行转换。使用.str.split使用 expand=Truevariable 列(由 pd.melt 从列中构造)中的信息拆分为三个单独的列,并将它们重命名为有意义的名称。然后使用set_index这样我们就可以unstack ,根据需要将信息从长格式分散到三列中。最后,将日期时间特征更改为您想要的数字。

希望有帮助

关于具有重复列类别的 Pandas 数据透视表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54428768/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com