在python中格式化固定效果回归(paneldata)的数据?
我有一个大数据集,需要对其进行时间序列分析。数据当前以excel格式显示,格式如下:在python中格式化固定效果回归(paneldata)的数据?,python,pandas,time-series,panel-data,Python,Pandas,Time Series,Panel Data,我有一个大数据集,需要对其进行时间序列分析。数据当前以excel格式显示,格式如下: +----+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+-----------
+----+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+
| ID | Q1 09 variable X | Q2 09 variable X | Q3 09 variable X | Q4 09 variable X | Q1 10 variable X | Q2 10 variable X | Q3 10 variable X | Q4 10 variable X | Q1 09 variable Y | Q2 09 variable Y | Q3 09 variable Y | Q4 09 variable Y | Q1 10 variable Y | Q2 10 variable Y | Q3 10 variable Y | Q4 10 variable Y |
+----+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+
| 1 | X | X | X | X | X | X | X | X | Y | Y | Y | Y | Y | Y | Y | Y |
| 2 | X | X | X | X | X | X | X | X | Y | Y | Y | Y | Y | Y | Y | Y |
| 3 | X | X | X | X | X | X | X | X | Y | Y | Y | Y | Y | Y | Y | Y |
| 4 | X | X | X | X | X | X | X | X | Y | Y | Y | Y | Y | Y | Y | Y |
| 5 | X | X | X | X | X | X | X | X | Y | Y | Y | Y | Y | Y | Y | Y |
| 6 | X | X | X | X | X | X | X | X | Y | Y | Y | Y | Y | Y | Y | Y |
| 7 | X | X | X | X | X | X | X | X | Y | Y | Y | Y | Y | Y | Y | Y |
| 8 | X | X | X | X | X | X | X | X | Y | Y | Y | Y | Y | Y | Y | Y |
| 9 | X | X | X | X | X | X | X | X | Y | Y | Y | Y | Y | Y | Y | Y |
+----+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+
上表就是一个例子。该数据集包含截至2019年第一季度的所有季度数据。我需要这样的数据:
+----+-------+------------+------------+
| ID | T | Variable X | Variable Y |
+----+-------+------------+------------+
| 1 | Q1 09 | X | Y |
| 1 | Q2 09 | X | Y |
| 1 | Q3 09 | X | Y |
| 1 | Q4 09 | X | Y |
| 1 | Q1 10 | X | Y |
| 1 | Q2 10 | X | Y |
| 1 | Q3 10 | X | Y |
| 1 | Q4 10 | X | Y |
| 2 | Q1 09 | X | Y |
| 2 | Q2 09 | X | Y |
| 2 | Q3 09 | X | Y |
| 2 | Q4 09 | X | Y |
| 2 | Q1 10 | X | Y |
| 2 | Q2 10 | X | Y |
| 2 | Q3 10 | X | Y |
| 2 | Q4 10 | X | Y |
| 3 | Q1 09 | X | Y |
| 3 | Q2 09 | X | Y |
| 3 | Q3 09 | X | Y |
| 3 | Q4 09 | X | Y |
| 3 | Q1 10 | X | Y |
| 3 | Q2 10 | X | Y |
| 3 | Q3 10 | X | Y |
| 3 | Q4 10 | X | Y |
| 4 | Q1 09 | X | Y |
| 4 | Q2 09 | X | Y |
| 4 | Q3 09 | X | Y |
| 4 | Q4 09 | X | Y |
| 4 | Q1 10 | X | Y |
| 4 | Q2 10 | X | Y |
| 4 | Q3 10 | X | Y |
| 4 | Q4 10 | X | Y |
| 5 | Q1 09 | X | Y |
| 5 | Q2 09 | X | Y |
| 5 | Q3 09 | X | Y |
| 5 | Q4 09 | X | Y |
| 5 | Q1 10 | X | Y |
| 5 | Q2 10 | X | Y |
| 5 | Q3 10 | X | Y |
| 5 | Q4 10 | X | Y |
| 6 | Q1 09 | X | Y |
| 6 | Q2 09 | X | Y |
| 6 | Q3 09 | X | Y |
| 6 | Q4 09 | X | Y |
| 6 | Q1 10 | X | Y |
| 6 | Q2 10 | X | Y |
| 6 | Q3 10 | X | Y |
| 6 | Q4 10 | X | Y |
| 7 | Q1 09 | X | Y |
| 7 | Q2 09 | X | Y |
| 7 | Q3 09 | X | Y |
| 7 | Q4 09 | X | Y |
| 7 | Q1 10 | X | Y |
| 7 | Q2 10 | X | Y |
| 7 | Q3 10 | X | Y |
| 7 | Q4 10 | X | Y |
| 8 | Q1 09 | X | Y |
| 8 | Q2 09 | X | Y |
| 8 | Q3 09 | X | Y |
| 8 | Q4 09 | X | Y |
| 8 | Q1 10 | X | Y |
| 8 | Q2 10 | X | Y |
| 8 | Q3 10 | X | Y |
| 8 | Q4 10 | X | Y |
| 9 | Q1 09 | X | Y |
| 9 | Q2 09 | X | Y |
| 9 | Q3 09 | X | Y |
| 9 | Q4 09 | X | Y |
| 9 | Q1 10 | X | Y |
| 9 | Q2 10 | X | Y |
| 9 | Q3 10 | X | Y |
| 9 | Q4 10 | X | Y |
+----+-------+------------+------------+
数据集非常大,总共有数千个数据点
我之前曾就这个问题发表过帖子,但我想我没有正确地阐述这个问题。我尝试了下面的代码,但它忽略了Y列
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()
通过所有带变量的列创建
多索引
,以便可以通过-将两个T
列连接在一起:
df = df.set_index('ID')
df.columns = df.columns.str.split(n=2, expand=True)
df = df.stack([0,1]).rename_axis(('ID','T','T1')).reset_index()
df['T'] = df['T'] + ' ' + df.pop('T1')
print (df.head(10))
ID T variable X variable Y
0 1 Q1 09 X Y
1 1 Q1 10 X Y
2 1 Q2 09 X Y
3 1 Q2 10 X Y
4 1 Q3 09 X Y
5 1 Q3 10 X Y
6 1 Q4 09 X Y
7 1 Q4 10 X Y
8 2 Q1 09 X Y
9 2 Q1 10 X Y
或者,如果可能,通过列的前5个值和另一个值创建多索引
:
df = df.set_index('ID')
df.columns = pd.MultiIndex.from_tuples(zip(df.columns.str[:5], df.columns.str[5:]))
df = df.stack(0).rename_axis(('ID','T')).reset_index()
如果顺序很重要,请使用排序值和最后一次排序值创建列:
df = df.set_index('ID')
c = df.columns.str[:5]
df.columns = pd.MultiIndex.from_tuples(zip(c, df.columns.str[5:]))
df1 = df.stack(0).rename_axis(('ID','T')).reset_index()
df1['T'] = pd.CategoricalIndex(df1['T'], ordered=True, categories=c.unique())
df1 = df1.sort_values(['ID','T'])
print (df1.head(10))
ID T variable X variable Y
0 1 Q1 09 X Y
2 1 Q2 09 X Y
4 1 Q3 09 X Y
6 1 Q4 09 X Y
1 1 Q1 10 X Y
3 1 Q2 10 X Y
5 1 Q3 10 X Y
7 1 Q4 10 X Y
8 2 Q1 09 X Y
10 2 Q2 09 X Y
我们可以用变量(X,Y)拆分数据帧。然后,我们将您的列熔化为行。最后,我们将分离出来的数据再次合并到一起 最后一行是通过删除格式中的所有内容来清理
T
列:
变量X
X = df[['ID']].join(df.filter(regex='X$')).melt(id_vars='ID', var_name='T', value_name='Variable X')
Y = df[['ID']].join(df.filter(regex='Y$')).melt(id_vars='ID', var_name='T', value_name='Variable Y')
df = pd.concat([X, Y[['Variable Y']]], axis=1).sort_values(['ID', 'T']).reset_index(drop=True)
df['T'] = df['T'].str.replace('\svariable\s[A-Za-z]', '')
输出
ID T Variable X Variable Y
0 1 Q1 09 X Y
1 1 Q1 10 X Y
2 1 Q2 09 X Y
3 1 Q2 10 X Y
4 1 Q3 09 X Y
5 1 Q3 10 X Y
6 1 Q4 09 X Y
7 1 Q4 10 X Y
8 2 Q1 09 X Y
9 2 Q1 10 X Y
10 2 Q2 09 X Y
11 2 Q2 10 X Y
12 2 Q3 09 X Y
13 2 Q3 10 X Y
14 2 Q4 09 X Y
15 2 Q4 10 X Y
16 3 Q1 09 X Y
17 3 Q1 10 X Y
18 3 Q2 09 X Y
19 3 Q2 10 X Y
20 3 Q3 09 X Y
21 3 Q3 10 X Y
22 3 Q4 09 X Y
23 3 Q4 10 X Y
24 4 Q1 09 X Y
25 4 Q1 10 X Y
26 4 Q2 09 X Y
27 4 Q2 10 X Y
28 4 Q3 09 X Y
29 4 Q3 10 X Y
.. .. ... ... ...
42 6 Q2 09 X Y
43 6 Q2 10 X Y
44 6 Q3 09 X Y
45 6 Q3 10 X Y
46 6 Q4 09 X Y
47 6 Q4 10 X Y
48 7 Q1 09 X Y
49 7 Q1 10 X Y
50 7 Q2 09 X Y
51 7 Q2 10 X Y
52 7 Q3 09 X Y
53 7 Q3 10 X Y
54 7 Q4 09 X Y
55 7 Q4 10 X Y
56 8 Q1 09 X Y
57 8 Q1 10 X Y
58 8 Q2 09 X Y
59 8 Q2 10 X Y
60 8 Q3 09 X Y
61 8 Q3 10 X Y
62 8 Q4 09 X Y
63 8 Q4 10 X Y
64 9 Q1 09 X Y
65 9 Q1 10 X Y
66 9 Q2 09 X Y
67 9 Q2 10 X Y
68 9 Q3 09 X Y
69 9 Q3 10 X Y
70 9 Q4 09 X Y
71 9 Q4 10 X Y
[72 rows x 4 columns]
旁注:这绝对是一个用例,只是无法让它与
stubnames
参数一起工作。请假设“X”和“Y”变量将是数字。您可以将df.filter(regex='X$)
更改为数据表示的任何值,'X$'
表示以X结尾。因此,您可以将X更改为两个变量的数字@MadsAndersenwell所有观测值的数字都不同,所以不能只插入数字那么如何区分变量?在列中显示代表两个不同变量的X,Y@MadsAndersenNo,数据当前的格式是,第一列包含跨季度的第一个变量“X”的数据。下一栏包含另一个变量“Y”在季度间的数据。因此,变量根据列的名称进行区分。