2016-04-20 7 views
1

Я работаю с данными опроса, в которых респонденты дважды брали интервью: один раз изначально и один раз от шести до восьми месяцев. С каждым месяцем встречаются новые собеседники, что приводит к созданию вращающейся панели. Как я могу соответствовать индивидууму к его/ее предыдущим интервью в 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) и идентификатор 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 

Я посмотрел в документации «сливаться» для панд и попробовали пару различных способов сопоставления дат и идентификаторов, индексируя их, но, похоже, не могут получить панель структура данных.

+0

Вы смогли заставить это работать в конце концов? – Stefan

+0

Извините за задержанный ответ. К сожалению, это похоже на реализацию результатов второго шага в кадре данных без значений (кроме заголовков). Я пытался работать над решением, которое менее утомительно, чем создание двух разных фреймов данных (один с людьми, которые ранее отвечали, а один с лицами, которые этого не сделали), и слияние этих. Любые дополнительные предложения были бы полезными, так как указывали бы на любые очевидные ошибки, которые я мог бы сделать. – Martin

+0

Вы можете получить пустой 'DataFrame', предполагая, что имена столбцов слияния верны, и есть фактические совпадения, если типы данных не соответствуют - одна цифра, одна строка или дата-время. Взгляните на '.info()' как для 'df' для стартеров. Являются ли приведенные ниже команды или вам нужно какое-либо разъяснение, что они должны делать? – Stefan

ответ

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 
+0

Могли ли вы решить это? – Stefan

 Смежные вопросы

  • Нет связанных вопросов^_^