如何跨时间匹配一个人的调查响应以形成面板数据集?

How can I match one individual's survey responses across time to form a panel dataset?

我正在处理调查数据,其中受访者接受了两次采访:一次是最初,一次是在六到八个月后。每个月都会联系新的受访者,从而形成轮换的小组结构。我如何使用以下信息将个人与 Python 中的 his/her 之前的采访相匹配:

   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,但似乎无法获取面板数据结构。

开始于:

   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

从哪里可以 select 您需要的 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