熊猫pivos csv文件包含基于日期的销售数据

时间:2018-07-14 18:50:47

标签: python pandas dataframe pivot

我有一个需求,我需要对销售数据和每年销售的单位数进行透视。

我的输入数据如下: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的新手,我对如何进一步使用它一无所知。我很难过,在这方面的任何帮助都将受到赞赏。

谢谢。

编辑:

  

我需要根据列名中的'year'拆分列。要求是搜索必须基于正则表达式。

1 个答案:

答案 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