gpt4 book ai didi

python - pandas 数据透视 csv 文件,包含基于日期的销售数据

转载 作者:行者123 更新时间:2023-12-01 09:15:07 26 4
gpt4 key购买 nike

我有一个要求,需要转换销售数据和每年销售的单位数量。

我的输入数据如下所示:enter image description here

到目前为止我的方法:

import pandas as pd
import re
dfg=pd.read_csv("document.csv")
dfg
lst=dfg.columns.tolist() # converting dataframe columns to list
lst

import numpy as np

datadict={}

sales_values=[]
units_values=[]

sales_year_lst=[]
units_year_lst=[]

for ln in lst:

if re.match(r"\d{4}\_sales", ln):
match = re.search('\d{4}', ln)
year=match.group(0)
sales_year_lst.append(year)
sales_values.append(dfg[ln].values)
datadict['sales_year']=sales_year_lst
datadict['sales']=sales_values

elif re.match(r"\d{4}\_units_sold", ln):
match = re.search('\d{4}', ln)
year=match.group(0)
units_year_lst.append(year)
units_values.append(dfg[ln].values)
datadict['units_year']=units_year_lst
datadict['units']=units_values

# created a data dictionary to store the year value, sales and
# units values respectively

df=pd.DataFrame(datadict)
df
# created a dataframe from the dictionary

dff=df.apply(lambda x: x.apply(pd.Series)
.stack()
.reset_index(level=1, drop=True)
).rename_axis('month').reset_index()


dfk=dff[["sales_year","sales","units"]]

dfgh = dfg[dfg.columns.drop(list(dfg.filter(regex='\d{4}')))]
frames = [dfgh,dfk]

result = pd.concat(frames,axis=1,join='outer')
result.fillna(method='ffill')

我得到的输出是这样的: enter image description here

连接数据帧后, fillna 所做的是获取最后一列值,这是我不想要的。

我的预期输出是这样的:

enter image description here

我是 python 新手,我不知道如何进一步处理。我陷入了困境,非常感谢这方面的任何帮助。

提前致谢。

编辑:

I need to split the column based on 'year' in the column name. The requirement is such that the search has to be based on a regular expression.

最佳答案

您可以通过使用 stack 的列多重索引来 reshape 数据框:

输入df:

df = pd.DataFrame({'name':['A']*2+['B']*2,'pack':['1g','500mg','1g','500mg'],'2017_sales':[500,600,1200,400],'2018_sales':[300,500,800,200],
'2017_units_sold':[50,60,120,40],'2018_units_sold':[30,50,80,20]})

2017_sales 2017_units_sold 2018_sales 2018_units_sold name pack
0 500 50 300 30 A 1g
1 600 60 500 50 A 500mg
2 1200 120 800 80 B 1g
3 400 40 200 20 B 500mg

现在,使用以下命令:

df1 = df.set_index(['name','pack'])
df1.columns = df1.columns.str.split('_', 1, expand=True) #creating multiindex with split
df_out = df1.stack(0).reset_index().rename(columns={'level_2':'year'})
df_out

输出:

  name   pack  year  sales  units_sold
0 A 1g 2017 500 50
1 A 1g 2018 300 30
2 A 500mg 2017 600 60
3 A 500mg 2018 500 50
4 B 1g 2017 1200 120
5 B 1g 2018 800 80
6 B 500mg 2017 400 40
7 B 500mg 2018 200 20

关于python - pandas 数据透视 csv 文件,包含基于日期的销售数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51342473/

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