您好我是stata用户,我正在尝试将我的代码传递给Pandas。我有一个面板数据,如下所示,我正在寻找一个命令,可以根据行所在的年份和季度创建一个常量变量。在stata中,这样的命令将由gen new_variable = yq(year,quarter)再现
我的数据框看起来像这样
id year quarter
1 2007 1
1 2007 2
1 2007 3
1 2007 4
1 2008 1
1 2008 2
1 2008 3
1 2008 4
1 2009 1
1 2009 2
1 2009 3
1 2009 4
2 2007 1
2 2007 2
2 2007 3
2 2007 4
2 2008 1
2 2008 2
2 2008 3
2 2008 4
3 2009 2
3 2009 3
3 2010 2
3 2010 3
我的预期输出应该如下所示:( new_variable中的值是任意的,只是寻找一个常数值,每年和季度和连续值总是相同的)
id year quarter new_variable
1 2007 1 220
1 2007 2 221
1 2007 3 222
1 2007 4 223
1 2008 1 224
1 2008 2 225
1 2008 3 226
1 2008 4 227
1 2009 1 228
1 2009 2 229
1 2009 3 230
1 2009 4 231
2 2007 1 220
2 2007 2 221
2 2007 3 222
2 2007 4 223
2 2008 1 224
2 2008 2 225
2 2008 3 226
2 2008 4 227
3 2009 2 229
3 2009 3 230
3 2010 2 233
3 2010 3 234
答案 0 :(得分:1)
我的解决方案扩展了@johnchase的思想:从year
到quarter
的笛卡尔积生成一个字典映射,将字符串表示形式year + quarter
转换为整数。
ys = df['year'].unique()
qs = df['quarter'].unique()
new_idx = pd.MultiIndex.from_product([ys, qs], names=['year', 'quarter'])
yq = [''.join([str(a), str(b)]) for a, b in new_idx.values]
# yq
# ['20071', '20072', '20073', '20074',
# '20081', '20082', '20083', '20084',
# '20091', '20092', '20093', '20094',
# '20101', '20102', '20103', '20104']
mapper = {k:i+220 for i, k in enumerate(yq)}
df['new_variable'] = df['year'].astype(str) + df['quarter'].astype(str)
df['new_variable'] = df['new_variable'].map(mapper)
df
id year quarter new_variable
0 1 2007 1 220
1 1 2007 2 221
2 1 2007 3 222
3 1 2007 4 223
4 1 2008 1 224
5 1 2008 2 225
6 1 2008 3 226
7 1 2008 4 227
8 1 2009 1 228
9 1 2009 2 229
10 1 2009 3 230
11 1 2009 4 231
12 2 2007 1 220
13 2 2007 2 221
14 2 2007 3 222
15 2 2007 4 223
16 2 2008 1 224
17 2 2008 2 225
18 2 2008 3 226
19 2 2008 4 227
20 3 2009 2 229
21 3 2009 3 230
22 3 2010 2 233
23 3 2010 3 234