为了账号安全,请及时绑定邮箱和手机立即绑定

Pandas 将重复的列转换为行

Pandas 将重复的列转换为行

HUWWW 2023-10-31 19:23:58
我有一个像这样的数据框,其中包含重复的列名:ID 作为索引加载          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我想将其显示如下:  ID    Sales   Revenue  03    10.00   5.00  05    20.00   20.00  06    30.00   30.00  07    30.00   30.00  03    0.00    0.00  05    20.00   20.00  06    30.00   30.00  07    30.00   30.00  03    10.00   19.00  05    20.00   20.00  06    30.00   30.00  07    30.00   30.00目前我正在使用,但期待更好的方法。我尝试过熔化,但这仅适用于一列:cols = df.columns.to_list()for i in range(1, len(cols), 2):  # #Loading each month's data to the data frame    sub_cols = cols[i:i + 2]    sub_cols .insert(0, cols[0])    sub_df = df.filter(sub_cols , axis=1)    sub_df.columns = ['ID', 'Revenue', 'Sales']    if i == 1:        final_df = sub_df    else:        final_df = final_df.append(sub_df)
查看完整描述

2 回答

?
森林海

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?')]})


查看完整回答
反对 回复 2023-10-31
?
大话西游666

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



查看完整回答
反对 回复 2023-10-31
  • 2 回答
  • 0 关注
  • 126 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信