2013-09-26 13 views
8

Mam DataFrame Panda z danymi DATE_TIME/napięcie tak (DF1):porównaj 2 kolumny 2 różnych dataframes pandy, jeśli ta sama wkładka 1 do drugiej w Pythonie

 Date_Time Chan 
0 20130401 9:00 AAT 
1 20130401 10:00 AAT 
2 20130401 11:00 AAT 
3 20130401 12:00 AAT 
4 20130401 13:00 AAT 
5 20130401 14:00 AAT 
6 20130401 15:00 AAT 

Używam tego jako prototyp do wczytania danych z dużo większego pliku danych i utworzenia jednej DataFrame. Drugi DataFrame wygląda następująco (DF2):

Chan   date_time Sens1 Sens2 
AAC 01-Apr-2013 09:00 5.17 1281 
AAC 01-Apr-2013 10:00 5.01 500 
AAC 01-Apr-2013 12:00 5.17 100 
AAC 01-Apr-2013 13:00 5.19 41997 
AAC 01-Apr-2013 16:00 5.21 2123 
AAT 01-Apr-2013 09:00 28.82 300 
AAT 01-Apr-2013 10:00 28.35 4900 
AAT 01-Apr-2013 12:00 28.04 250 
AAE 01-Apr-2013 11:00 3.36 400 
AAE 01-Apr-2013 12:00 3.41 200 
AAE 01-Apr-2013 13:00 3.40 2388 
AAE 01-Apr-2013 14:00 3.37 300 
AAE 01-Apr-2013 15:00 3.35 500 
AXN 01-Apr-2013 09:00 23.96 6643 
AXN 01-Apr-2013 10:00 24.03 1000 
AXW 01-Apr-2013 11:00 46.44 2343 

Więc to, co chcę zrobić, to znaleźć df2 dla wszystkich wystąpień meczu z obu kolumn DF1 (zważywszy różnych formatów danych) i wstawić dane z DF2 do df1. Tak (DF1)

  Date_Time Chan Sens1 Sens2 
0 20130401 9:00 AAT 28.82 300 
1 20130401 10:00 AAT 28.35 4900 
2 20130401 11:00 AAT NaN NaN 
3 20130401 12:00 AAT 28.04 250 
4 20130401 13:00 AAT NaN NaN 
5 20130401 14:00 AAT NaN NaN 
6 20130401 15:00 AAT NaN NaN 

Czy możesz dać mi jakieś sugestie co do kodu Pythona/pandy dopasować ten psuedocode:

if (df1['date_time'] = df2['date_time']) & (df1['Chan'] = df2['Chan'])): 
    df1['Sens1'] = df2['Sens1'] 
    df1['Sens2'] = df2['Sens2'] 

Jeśli to wpływa na odpowiedź, to jest moim zamiarem bfill i ffill NaN, a następnie dodaj tę DataFrame do panelu, a następnie powtórz z inną nazwą kanału zamiast AAT.

Odpowiedz

9

Możesz użyć prostego scalania, aby to zrobić. Ale najpierw trzeba zrobić trochę oczyszczanie z was DataFrames, aby upewnić się, że kolumny datetime są rzeczywiście datetimes zamiast strun (uwaga: może lepiej byłoby to zrobić podczas czytania jak csv lub cokolwiek):

df1['Date_Time'] = pd.to_datetime(df1['Date_Time'], format='%Y%m%d %H:%M') 
df2['date_time'] = pd.to_datetime(df2['date_time']) 

Załóżmy również zmienić nazwę kolumny datetime o tej samej nazwie:

df1.rename(columns={'Date_Time': 'Datetime'}, inplace=True) 
df2.rename(columns={'date_time': 'Datetime'}, inplace=True) 

teraz proste scalanie da ci to, czego jesteś po:

In [11]: df1.merge(df2) 
Out[11]: 
      Datetime Chan Sens1 Sens2 
0 2013-04-01 09:00:00 AAT 28.82 300 
1 2013-04-01 10:00:00 AAT 28.35 4900 
2 2013-04-01 12:00:00 AAT 28.04 250 

In [12]: df1.merge(df2, how='left') 
Out[12]: 
      Datetime Chan Sens1 Sens2 
0 2013-04-01 09:00:00 AAT 28.82 300 
1 2013-04-01 10:00:00 AAT 28.35 4900 
2 2013-04-01 11:00:00 AAT NaN NaN 
3 2013-04-01 12:00:00 AAT 28.04 250 
4 2013-04-01 13:00:00 AAT NaN NaN 
5 2013-04-01 14:00:00 AAT NaN NaN 
6 2013-04-01 15:00:00 AAT NaN NaN 
+0

mogę zobaczyć, jak to będzie działać, ale jestem coraz błąd: "TypeError: to _datetime() ma nieoczekiwany argument słowa kluczowego "format" w linii pd.to_datetime. Czy jest to funkcja, która dodała format w późniejszej wersji pandy. Mam wersję pand, która została dołączona do Pyzo (które uważałem za 0.12). – knight2270

+0

Zgodnie z tą "pd .__ version__" mam wersję 0.10.1. Pozwól, że to naprawię i wrócę do tego problemu, ponieważ przeczytałem coś o zmianach formatu między 10 a 12. – knight2270

+0

OK Tak więc podniosłem stan wysoki i niski. Wierzę, że pakiet Pyzo 2013b zawiera pandy 0.10.0. Ostatni jest 0.12.0 Nie mogę uzyskać metody formatu ", format ="% Y% m% d% H:% M '' – knight2270

Powiązane problemy