2015-01-22 16 views
9

Z pewnością brakuje mi tutaj czegoś prostego. Próba scalenia dwóch ramek danych w pandach, które mają w większości te same nazwy kolumn, ale prawy ramka danych ma kilka kolumn, których nie ma po lewej stronie i na odwrót.Pandy łączą dwie ramki danych z różnymi kolumnami

>df_may 

    id quantity attr_1 attr_2 
0 1  20  0  1 
1 2  23  1  1 
2 3  19  1  1 
3 4  19  0  0 

>df_jun 

    id quantity attr_1 attr_3 
0 5   8  1  0 
1 6  13  0  1 
2 7  20  1  1 
3 8  25  1  1 

Próbowałem łączenia z outer join:

mayjundf = pd.DataFrame.merge(df_may, df_jun, how="outer") 

Ale że plony:

Left data columns not unique: Index([.... 

Mam określone również pojedynczą kolumnę do przyłączenia (on = " id ", np.), ale to powiela wszystkie kolumny z wyjątkiem" id "jak attr_1_x, attr_1_y, co nie jest idealne. Ja również przeszedł całą listę kolumn (jest ich wiele) na "ON":

mayjundf = pd.DataFrame.merge(df_may, df_jun, how="outer", on=list(df_may.columns.values)) 

co daje:

ValueError: Buffer has wrong number of dimensions (expected 1, got 2) 

Czego mi brakuje? Chciałbym otrzymać plik df z dodanymi wszystkimi wierszami, a attr_1, attr_2, attr_3 wypełnione, gdzie to możliwe, NaN, gdzie nie pojawiają się. Wydaje się to być dość typowym przepływem pracy w celu zmieniania danych, ale utknąłem.

Z góry dziękuję.

+0

myślę chcesz 'mayjundf = pd .DataFrame.merge (df_may, df_jun, how = "outer", on = 'id') ' – EdChum

+0

Podałeś" how "dwa razy, wydajność: SyntaxError: argument słowa kluczowego powtórzony – economy

+0

Właściwie myślę, że chcesz:' pd.concat ([df_may, df_jun], axis = 0, ignore_index = True) ' – EdChum

Odpowiedz

18

myślę, że w tym przypadku concat to, co chcesz:

In [12]: 

pd.concat([df,df1], axis=0, ignore_index=True) 
Out[12]: 
    attr_1 attr_2 attr_3 id quantity 
0  0  1  NaN 1  20 
1  1  1  NaN 2  23 
2  1  1  NaN 3  19 
3  0  0  NaN 4  19 
4  1  NaN  0 5   8 
5  0  NaN  1 6  13 
6  1  NaN  1 7  20 
7  1  NaN  1 8  25 

przekazując axis=0 tu jesteś układania DF jest na górze siebie, co moim zdaniem jest to, co chcesz, a następnie produkcji NaN wartość gdzie są nieobecny w ich odpowiednich plikach dfs.

+0

Bliżej. Czy istnieje ograniczenie liczby kolumn konkat? AssertionError: Liczba pozycji menedżera musi być równa liczbie elementów blokowych # elementów menedżera: 70, # tot_items: 71 – economy

+0

Nie wierzę tak Jeśli masz problem z danymi z Twojego świata, musisz wysłać próbkę tych danych i kodu, który odtwarza twój problem, w przeciwnym razie nie mogę ci pomóc, również pomógłbyś, gdybyś opublikował dane wyjściowe z obu plików df, kiedy możesz '.info()' na nich – EdChum

+0

To było coś prostego, paren wewnątrz nazwy kolumny od plik formatu powodował duplikowanie nazw kolumn. Daję @EdChum odpowiedź, ponieważ ta metoda jest z pewnością najłatwiejszym sposobem na uzyskanie dołączenia. – economy

0

miałem ten problem dzisiaj korzystając z jednej z concat, dołączania lub scalania i mam wokół niego dodając kolejno kolumny pomocnik numerowanej, a następnie robi sprzężenie zewnętrzne

```helper=1 
for i in df1.index: 
    df1.loc[i,'helper']=helper 
    helper=helper+1 
for i in df2.index: 
    df2.loc[i,'helper']=helper 
    helper=helper+1 
df1.merge(df2,on='helper',how='outer')``` 
Powiązane problemy