我需要对面板数据进行时间序列分析。当前数据的格式如下表所示:
+------+---------+---------+---------+---------+---------+---------+---------+---------+
| | Q1 | Q2 | Q3 | Q4 | Q1 | Q2 | Q3 | Q4 |
+------+---------+---------+---------+---------+---------+---------+---------+---------+
| ID 1 | Value 1 | Value 1 | Value 1 | Value 1 | Value 2 | Value 2 | Value 2 | Value 2 |
| ID 2 | Value 1 | Value 1 | Value 1 | Value 1 | Value 2 | Value 2 | Value 2 | Value 2 |
| ID 3 | Value 1 | Value 1 | Value 1 | Value 1 | Value 2 | Value 2 | Value 2 | Value 2 |
| ID 4 | Value 1 | Value 1 | Value 1 | Value 1 | Value 2 | Value 2 | Value 2 | Value 2 |
+------+---------+---------+---------+---------+---------+---------+---------+---------+
我需要将值1和2的季度数据像这样堆叠:
+------+---------+---------+----+
| ID | X | Y | T |
+------+---------+---------+----+
| ID 1 | Value 1 | Value 2 | Q1 |
| ID 1 | Value 1 | Value 2 | Q2 |
| ID 1 | Value 1 | Value 2 | Q3 |
| ID 1 | Value 1 | Value 2 | Q4 |
| ID 2 | Value 1 | Value 2 | Q1 |
| ID 2 | Value 1 | Value 2 | Q2 |
| ID 2 | Value 1 | Value 2 | Q3 |
| ID 2 | Value 1 | Value 2 | Q4 |
| ID 3 | Value 1 | Value 2 | Q1 |
| ID 3 | Value 1 | Value 2 | Q2 |
| ID 3 | Value 1 | Value 2 | Q3 |
| ID 3 | Value 1 | Value 2 | Q4 |
| ID 4 | Value 1 | Value 2 | Q1 |
| ID 4 | Value 1 | Value 2 | Q2 |
| ID 4 | Value 1 | Value 2 | Q3 |
| ID 4 | Value 1 | Value 2 | Q4 |
+------+---------+---------+----+
数据集非常大,总共有数千个数据点。
我是一个初学者,所以我迷路了。
答案 0 :(得分:3)
stack
,reset_index
df.columns = [
df.columns.to_series().groupby(level=0).cumcount().map({0: 'X', 1: 'Y'}),
df.columns
]
df.stack().rename_axis(['ID', 'T']).reset_index()
ID T X Y
0 ID 1 Q1 Value 1 Value 2
1 ID 1 Q2 Value 1 Value 2
2 ID 1 Q3 Value 1 Value 2
3 ID 1 Q4 Value 1 Value 2
4 ID 2 Q1 Value 1 Value 2
5 ID 2 Q2 Value 1 Value 2
6 ID 2 Q3 Value 1 Value 2
7 ID 2 Q4 Value 1 Value 2
8 ID 3 Q1 Value 1 Value 2
9 ID 3 Q2 Value 1 Value 2
10 ID 3 Q3 Value 1 Value 2
11 ID 3 Q4 Value 1 Value 2
12 ID 4 Q1 Value 1 Value 2
13 ID 4 Q2 Value 1 Value 2
14 ID 4 Q3 Value 1 Value 2
15 ID 4 Q4 Value 1 Value 2
答案 1 :(得分:2)
重命名列,然后 pd.wide_to_long
:
np.random.seed(123)
df = pd.DataFrame(np.random.randint(1,10,(4,8)),
index=['ID 1', 'ID 2', 'ID 3', 'ID 4'])
df.columns = ['Q1', 'Q2', 'Q3', 'Q4']*2
Q1 Q2 Q3 Q4 Q1 Q2 Q3 Q4
ID 1 3 3 7 2 4 7 2 1
ID 2 2 1 1 4 5 1 1 5
ID 3 2 8 4 3 5 8 3 5
ID 4 9 1 8 4 5 7 2 6
s = pd.Series(df.columns)
df.columns = [f'{y}_{x}' for x,y in zip(s, s.groupby(s).cumcount())]
#Index(['0_Q1', '0_Q2', '0_Q3', '0_Q4', '1_Q1', '1_Q2', '1_Q3', '1_Q4'])
pd.wide_to_long(df.reset_index(), i='index', j='Quarter',
stubnames=map(str, range(0, s.groupby(s).cumcount().max()+1)),
sep='_', suffix='.*').sort_index()
0 1
index Quarter
ID 1 Q1 3 4
Q2 3 7
Q3 7 2
Q4 2 1
ID 2 Q1 2 5
Q2 1 1
Q3 1 1
Q4 4 5
ID 3 Q1 2 5
Q2 8 8
Q3 4 3
Q4 3 5
ID 4 Q1 9 5
Q2 1 7
Q3 8 2
Q4 4 6