2016-04-20 17 views
1

Ich arbeite mit Umfragedaten, in denen Befragte zweimal interviewt wurden: einmal am Anfang und einmal sechs bis acht Monate später. Jeden Monat werden neue Befragte kontaktiert, was zu einer rotierenden Panelstruktur führt. Wie kann ich eine Person zu seinem/ihrem früheren Interview in Python mit den folgenden Informationen entsprechen:Wie kann ich die Umfrageantworten einzelner Personen zu einem Panel-Datensatz zuordnen?

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 

So heißt es in der erste Zeile, dass die bisherigen Antworten der Person an die Umfrage auf der Linie enthalten sind, wo das vorherige Datum ist 198612 (Dezember 1986) und die Identifikation ist 382. Wie ich diese Antworten bieten kann unter Verwendung der Informationen, die ich habe ein Panel-Datensatz der folgenden Form zu erstellen:

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 

ich in die „merge“ Dokumentation ausgesehen haben für Pandas und habe ein paar verschiedene Möglichkeiten ausprobiert, um die Daten und IDs durch Indexierung zu vergleichen, aber es scheint nicht, das Panel zu bekommen Datenstruktur.

+0

Konnten Sie das doch zum Laufen bringen? – Stefan

+0

Entschuldigung für die verzögerte Antwort. Leider sieht es so aus, als ob die Implementierung des zweiten Schritts zu einem Datenframe ohne Werte führt (abgesehen von den Headern). Ich habe versucht, an einer Lösung zu arbeiten, die weniger stumpf ist als das Erstellen von zwei verschiedenen Datenrahmen (einer mit Personen, die zuvor geantwortet haben, und einer mit Personen, die dies nicht getan haben) und diese zusammenführen. Irgendwelche zusätzlichen Vorschläge wären hilfreich, ebenso wie das Aufzeigen von offensichtlichen Fehlern, die ich möglicherweise mache. – Martin

+0

Sie könnten einen leeren 'DataFrame' erhalten, vorausgesetzt, die Namen der Zusammenführungsspalten sind korrekt und es gibt tatsächliche Übereinstimmungen, wenn die Datentypen nicht übereinstimmen - ein numerischer Wert, eine Zeichenfolge oder datetime. Sehen Sie sich '.info()' für beide 'df' für Starter an. Sind die folgenden Befehle klar oder benötigen Sie eine Erklärung, was sie tun sollen? – Stefan

Antwort

1

Beginnend mit:

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 

Sie könnten die beiden Beobachtungen kombinieren durch die Zusammenlegung:

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 

von wo aus man die wählen könnte columns Sie benötigen, oder während der Zusammenführung:

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 

Sie könnten ein Panel von hier aus bilden:

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

Konnten Sie das doch lösen? – Stefan