如何在一段时间内匹配一个人的调查回复以形成面板数据集?

时间:2016-04-20 05:58:47

标签: python pandas merge survey panel-data

我正在处理调查数据,其中受访者接受了两次访问:一次是初次,一次是六到八个月。每个月都会联系新的受访者,从而形成一个旋转的面板结构。如何使用以下信息将个人与他之前使用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,通过索引它们,但似乎无法获得面板数据结构。

1 个答案:

答案 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