pandas pivot_table列名不应存在以及如何对文本列进行排序

j0pj023g  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(72)

我在学Pandas。
我创建了这个测试框架:

dfdict = {'product':['ruler', 'pencil', 'case', 'rubber'],'sold':[4,23,0,14],'Quarter':['Q1/22','Q2/23','Q3/22','Q1/23']}
dftest=pd.DataFrame(dfdict)
dftemp=dftest.pivot_table(index=['product'],columns=['Quarter'],values=['sold'],aggfunc=sum,fill_value=0)
print(f"{dftemp}")

字符串
其产生:

sold
Quarter Q1/22 Q1/23 Q2/23 Q3/22
product
case        0     0     0     0
pencil      0     0    23     0
rubber      0    14     0     0
ruler       4     0     0     0


有两点需要帮助:
1.如何只删除sold列名?我不希望它出现在那里,因为当我将其写入csv时,每个Quarter列的上方都有一个“sold”名称。
1.我如何按日期顺序排列Quarter列,现在它们是文本。最好的方法是什么?是以某种方式将它们转换为日期,然后按相同的样式排列它们并写出它吗?

c7rzv4ha

c7rzv4ha1#

您可以将列Quarter转换为四分之一,以便pivot_table正确排序输出,删除sold列中的MultiIndex,更改一个元素列表,如[sold]sold

dftest['Quarter'] = pd.PeriodIndex(dftest['Quarter'].str[-2:] +
                                   dftest['Quarter'].str[:2], freq='Q')

dftemp=dftest.pivot_table(index='product',
                          columns='Quarter', 
                          values='sold',
                          aggfunc=sum,
                          fill_value=0)
print(f"{dftemp}")
Quarter  2022Q1  2022Q3  2023Q1  2023Q2
product                                
case          0       0       0       0
pencil        0       0       0      23
rubber        0       0      14       0
ruler         4       0       0       0

字符串
最后,如果需要原始格式或其他格式,请使用renamestrftime

dftemp = dftemp.rename(columns=lambda x: x.strftime('Q%q/%y'))
print(f"{dftemp}")
Quarter  Q1/22  Q3/22  Q1/23  Q2/23
product                            
case         0      0      0      0
pencil       0      0      0     23
rubber       0      0     14      0
ruler        4      0      0      0

xtupzzrd

xtupzzrd2#

不要使用列表作为pivot_table的参数,然后使用自定义键的sort_index(例如使用str.replacePeriodIndex):

out = (dftest
       .pivot_table(index='product', columns='Quarter', values='sold',
                    aggfunc=sum, fill_value=0)
       .sort_index(axis=1, key=lambda x: x.str.replace(r'(Q\d)/(\d+)', r'\2-\1', regex=True))
      )

字符串
或者:

out = (dftest
       .pivot_table(index='product', columns='Quarter', values='sold',
                    aggfunc=sum, fill_value=0)
       .sort_index(axis=1, key=lambda x: pd.PeriodIndex(x.str.replace(r'(Q\d)/(\d+)', r'\2-\1', regex=True), freq='Q'))
      )


输出量:

Quarter  Q1/22  Q3/22  Q1/23  Q2/23
product                            
case         0      0      0      0
pencil       0      0      0     23
rubber       0      0     14      0
ruler        4      0      0      0

相关问题