我有一个如下所示的数据集:
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多个类别。
答案 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