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

2024-10-06 10:33:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在研究调查数据,受访者接受了两次采访:一次是最初,一次是六到八个月后。每个月都会联系新的受访者,形成轮换小组结构。如何使用以下信息将个人与他/她以前的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,但似乎无法获得panel数据结构。你知道吗


Tags: 数据信息id面板pandas小组结构形式
1条回答
网友
1楼 · 发布于 2024-10-06 10:33:58

开始于:

   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

相关问题 更多 >