如何格式化数据以在python中进行面板数据分析?

时间:2019-07-15 14:33:15

标签: python pandas time-series panel-data

我需要对面板数据进行时间序列分析。当前数据的格式如下表所示:


+------+---------+---------+---------+---------+---------+---------+---------+---------+
|      |   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 |
+------+---------+---------+----+

数据集非常大,总共有数千个数据点。

我是一个初学者,所以我迷路了。

2 个答案:

答案 0 :(得分:3)

新列对象stackreset_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