我正在处理调查数据,其中受访者接受了两次访问:一次是初次,一次是六到八个月。每个月都会联系新的受访者,从而形成一个旋转的面板结构。如何使用以下信息将个人与他之前使用Python的访谈进行匹配:
CASEID YYYYMM ID IDPREV DATEPR INCOME
1 2 198706 2 382 198612 12500
2 3 198706 3 4 198612 2500
3 4 198706 4 67 198612 27500
4 5 198706 5 134 198612 12500
5 6 198706 6 193 198612 22500
因此,第一行说明个人之前的调查答案包含在上一个日期是198612(1986年12月)的行中,ID是382.我如何使用我的信息来匹配这些答案必须创建以下形式的面板数据集:
CASEID YYYYMM ID IDPREV DATEPR INCOME
1 463 198612 382 - - 12000
1856 198706 2 382 198612 12500
2 97 198612 4 - - 3500
1857 198706 3 4 198612 2500
3 164 198612 67 - - 25000
1858 198706 4 67 198612 27500
4 289 198612 134 - - 12500
1859 198706 5 134 198612 12500
5 323 198612 193 - - 22500
1860 198706 6 193 198612 22500
我已经查看了pandas的“merge”文档,并尝试了几种不同的方法来匹配日期和ID,通过索引它们,但似乎无法获得面板数据结构。
答案 0 :(得分:1)
从:
开始 CASEID YYYYMM ID IDPREV DATEPR INCOME
0 463 198612 382 NaN NaN 12000
1 1856 198706 2 382.0 198612.0 12500
2 97 198612 4 NaN NaN 3500
3 1857 198706 3 4.0 198612.0 2500
4 164 198612 67 NaN NaN 25000
5 1858 198706 4 67.0 198612.0 27500
6 289 198612 134 NaN NaN 12500
7 1859 198706 5 134.0 198612.0 12500
8 323 198612 193 NaN NaN 22500
9 1860 198706 6 193.0 198612.0 22500
您可以通过合并来结合两个观察结果:
combined = pd.merge(df, df, left_on=['YYYYMM', 'ID'], right_on=['DATEPR', 'IDPREV'], suffixes=['_1', '_2'])
CASEID_1 YYYYMM_1 ID_1 IDPREV_1 DATEPR_1 INCOME_1 CASEID_2 YYYYMM_2 \
0 463 198612 382 NaN NaN 12000 1856 198706
1 97 198612 4 NaN NaN 3500 1857 198706
2 164 198612 67 NaN NaN 25000 1858 198706
3 289 198612 134 NaN NaN 12500 1859 198706
4 323 198612 193 NaN NaN 22500 1860 198706
ID_2 IDPREV_2 DATEPR_2 INCOME_2
0 2 382.0 198612.0 12500
1 3 4.0 198612.0 2500
2 4 67.0 198612.0 27500
3 5 134.0 198612.0 12500
4 6 193.0 198612.0 22500
您可以从中选择所需的columns
,或在合并时:
combined = pd.merge(df.loc[:, ['CASEID', 'YYYYMM', 'ID', 'INCOME']], df,
left_on=['YYYYMM', 'ID'], right_on=['DATEPR', 'IDPREV'], suffixes=['_1', '_2'])
CASEID_1 YYYYMM_1 ID_1 INCOME_1 CASEID_2 YYYYMM_2 ID_2 IDPREV \
0 463 198612 382 12000 1856 198706 2 382.0
1 97 198612 4 3500 1857 198706 3 4.0
2 164 198612 67 25000 1858 198706 4 67.0
3 289 198612 134 12500 1859 198706 5 134.0
4 323 198612 193 22500 1860 198706 6 193.0
DATEPR INCOME_2
0 198612.0 12500
1 198612.0 2500
2 198612.0 27500
3 198612.0 12500
4 198612.0 22500
你可以从这里形成一个小组:
combined = combined.reset_index().set_index('index')
df1 = combined.loc[:, ['CASEID_1', 'YYYYMM_1', 'ID_1', 'INCOME_1']]
df1.rename(columns={col: col[:-2] for col in df1.columns}, inplace=True)
df2 = combined.loc[:, ['CASEID_2', 'YYYYMM_2', 'ID_2', 'INCOME_2']]
df2.rename(columns={col: col[:-2] for col in df2.columns}, inplace=True)
panel = pd.concat([df1, df2]).sort_index()
CASEID YYYYMM ID INCOME
index
0 463 198612 382 12000
0 1856 198706 2 12500
1 97 198612 4 3500
1 1857 198706 3 2500
2 164 198612 67 25000
2 1858 198706 4 27500
3 289 198612 134 12500
3 1859 198706 5 12500
4 323 198612 193 22500
4 1860 198706 6 22500