使用python重新排列数据帧

时间:2015-07-11 17:21:39

标签: python pandas

我有一个如下所示的数据集:

     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

我还是Pandas的新手,非常感谢你的帮助。

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

3 个答案:

答案 0 :(得分: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()

答案 1 :(得分: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    

答案 2 :(得分: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值和新的" 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