2015-07-11 60 views
1

我有一个数据集,看起来像这样:重新排列数据框中使用python

 Category  Date_x  Value_x  Date_y  Value_y 
     A   01/01/2015 3   02/01/2015 5 
     B   01/01/2015 6   02/01/2015 10 
     C   01/01/2015 7   02/01/2015 5 

使用Python,我怎样才能改变这个数据帧,使得看上去象下面这样:

 Category  Date_x Value_x 
     A   01/01/2015 3   
     A   02/01/2015 5 
     B   01/01/2015 6   
     B   02/01/2015 10 
     C   01/01/2015 7   
     C   02/01/2015 5 

我对熊猫来说还是新的,你的帮助将不胜感激。

编辑:我只显示了一部分数据集。它实际上是一个拥有100多个类别的大数据集。

回答

1

看起来好像您将两个数据框与水平轴上的日期,值和类别列合并或连接在一起。在这种情况下,您应该返回一个步骤并在纵轴上连接它们。如果不是这样,假定指数'Category',你可以做

df_1 = df[['Date_x', 'Value_x']].rename(columns={'Date_x': 'Date', 'Value_x': 'Value'}) 
df_2 = df[['Date_y', 'Value_y']].rename(columns={'Date_y': 'Date', 'Value_y': 'Value'}) 

df = pd.concat([df1, df2]).sort_index() 
+0

谢谢!这效果最好! –

0

如果您先将列重命名为多级列,然后使用.stack()重塑您的数据框,那么完成您的任务会更容易。

import pandas as pd 

# your data 
# =================================== 
print(df) 


    Category  Date_x Value_x  Date_y Value_y 
0  A 01/01/2015  3 02/01/2015  5 
1  B 01/01/2015  6 02/01/2015  10 
2  C 01/01/2015  7 02/01/2015  5 

# processing 
# ========================================= 
# put category column into index 
df = df.set_index('Category') 
# construct multi-level index based on the original columns 
multi_level_columns = pd.MultiIndex.from_arrays(np.array([x.split('_') for x in df.columns.values]).T) 
# replace the current column names with this new multi-level columns 
df.columns = multi_level_columns 


       Date Value  Date Value 
        x  x   y  y 
Category          
A   01/01/2015  3 02/01/2015  5 
B   01/01/2015  6 02/01/2015 10 
C   01/01/2015  7 02/01/2015  5 

# do stack 
df.stack(level=1).reset_index(level=1, drop=True) 


       Date Value 
Category     
A   01/01/2015  3 
A   02/01/2015  5 
B   01/01/2015  6 
B   02/01/2015  10 
C   01/01/2015  7 
C   02/01/2015  5  
0

我可能会使用CONCAT()这个

相框的开始

Category  Date_x Value_x  Date_y Value_y 
0  A 01/01/2015  3 02/01/2015  5 
1  B 01/01/2015  6 02/01/2015  10 
2  C 01/01/2015  7 02/01/2015  5 

然后选择y值和存储在一个新的框架。将其重命名以及

dfY = df[["Category","Date_y","Value_y"]] 
dfY.columns = ["Category","Date_x","Value_x"] 
dfY 

    Category  Date_x Value_x 
0  A 02/01/2015  5 
1  B 02/01/2015  10 
2  C 02/01/2015  5 

然后用x值的CONCAT从原来的框架和新的“Y”框架

pd.concat([df[["Category","Date_x","Value_x"]],dfY],ignore_index=True).sort(["Category","Date_x"]) 

     Category  Date_x   Value_x 
0  A   01/01/2015  3 
3  A   02/01/2015  5 
1  B   01/01/2015  6 
4  B   02/01/2015  10 
2  C   01/01/2015  7 
5  C   02/01/2015  5