我有一个需求,我需要对销售数据和每年销售的单位数进行透视。
到目前为止我的方法:
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')
连接数据帧后,fillna要做的是获取最后一个列值,这是我不想要的。
我的预期输出是这样的:
我是python的新手,我对如何进一步使用它一无所知。我很难过,在这方面的任何帮助都将受到赞赏。
谢谢。
编辑:
我需要根据列名中的'year'拆分列。要求是搜索必须基于正则表达式。
答案 0 :(得分:2)
您可以使用带有stack
的列的多索引重塑数据框的方式来做到这一点:
输入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