2 回答
![?](http://img1.sycdn.imooc.com/545868b60001587202200220-100-100.jpg)
TA贡献2011条经验 获得超2个赞
Pandas lreshape 帮我解决了这个问题。
df = pd.lreshape(df,
{'Sales': file_df.columns[file_df.columns.str.match(r'^Sales\.?\d?')],
'Revenue': file_df.columns[file_df.columns.str.match(r'^Revenue\.?\d?')]})
![?](http://img1.sycdn.imooc.com/545861f00001be3402200220-100-100.jpg)
TA贡献1817条经验 获得超14个赞
这是堆叠列的另一种方法。不确定它是否更有效,但它需要更少的代码。
# JANUARY FEBRUARY MARCH
# ID Sales Revenue Sales Revenue Sales Revenue
# 03 10.00 5.00 0.00 0.00 10.00 19.00
# 05 20.00 20.00 20.00 20.00 20.00 20.00
# 06 30.00 30.00 30.00 30.00 30.00 30.00
# 07 30.00 30.00 30.00 30.00 30.00 30.00
import pandas as pd
dd = {
'ID':['03','05','06','07'],
'Sales1':[10,20,30,30],
'Rev1':[5,20,30,30],
'Sales2':[0,20,30,30],
'Rev2':[0,20,30,30],
'Sales3':[10,20,30,30],
'Rev3':[19,20,30,30]
}
df = pd.DataFrame(dd)
print(df.to_string(index=False),'\n') # source dataframe
####################
dfnew = pd.DataFrame(columns = ['ID', 'Sales', 'Revenue']) # new dataframe with all data
for c in range(1,len(df.columns),2):
dftmp = df[['ID',df.columns[c],df.columns[c+1]]] # create df for each month
dftmp.columns = ['ID', 'Sales', 'Revenue'] # must rename columns for append
dfnew = dfnew.append(dftmp) # append to stacked df
print(dfnew.to_string(index=False))
输出
ID Sales1 Rev1 Sales2 Rev2 Sales3 Rev3
03 10 5 0 0 10 19
05 20 20 20 20 20 20
06 30 30 30 30 30 30
07 30 30 30 30 30 30
ID Sales Revenue
03 10 5
05 20 20
06 30 30
07 30 30
03 0 0
05 20 20
06 30 30
07 30 30
03 10 19
05 20 20
06 30 30
07 30 30
添加回答
举报