2012-08-31 17 views
5

Załóżmy, że mam dwie ramki danych „df_a” & „df_b”, oba mają taką samą strukturę indeksu i kolumny, ale niektóre z wewnętrznych elementów danych są różne:Jak zamienić i dodać element ramek danych przez inną ramkę danych w Pandonie Pythona?

>>> df_a 
      sales cogs 
STK_ID QT   
000876 1 100 100 
     2 100 100 
     3 100 100 
     4 100 100 
     5 100 100 
     6 100 100 
     7 100 100 

>>> df_b 
      sales cogs 
STK_ID QT   
000876 5 50 50 
     6 50 50 
     7 50 50 
     8 50 50 
     9 50 50 
     10 50 50 

A teraz chcę wymienić element df_a według elementu df_b, które mają tę samą współrzędną (indeks, kolumna) i dołączają elementy df_b, których współrzędne (indeks, kolumna) wykraczają poza zakres df_a. Podobnie jak dodać łatkę 'df_b' do 'df_a':

>>> df_c = patch(df_a,df_b) 
      sales cogs 
STK_ID QT   
000876 1 100 100 
     2 100 100 
     3 100 100 
     4 100 100 
     5 50 50 
     6 50 50 
     7 50 50 
     8 50 50 
     9 50 50 
     10 50 50 

Jak napisać 'łatkę (df_a, df_b)' funkcji?

+0

To wygląda na przypadek użycia dla nie została jeszcze wdrożona df_a.update (df_b, join „zewnętrznej” =), patrz pomoc (df_a.update) –

+0

Czy to nie jest po prostu "combine_first" (na dole)? –

Odpowiedz

1

podobne do odpowiedzi BrenBarn, ale z większą elastycznością:

# reindex both to union of indices 
df_ar = df_a.reindex(df_a.index | df_b.index) 
df_br = df_b.reindex(df_a.index | df_b.index) 

# replacement criteria can be put in this lambda function 
combiner = lambda: x, y: np.where(y < x, y, x) 
df_c = df_ar.combine(df.br, combiner) 
+0

Myślę, że w drugim wierszu 'df_a.index' zawiera już' df_b.index' – Winand

+0

@Winand Correct. Naprawiłem to. –

2

Spróbuj tego:

df_c = df_a.reindex(df_a.index | df_b.index) 
df_c.ix[df_b.index] = df_b 
2

aby wypełnić luki w jednej dataframe z wartości (lub nawet pełnych wierszach) z innego, wziąć spójrz na wbudowaną metodę df.combine_first().

In [34]: df_b.combine_first(df_a) 
Out[34]: 
      sales cogs 
STK_ID QT    
000876 1  100 100 
     2  100 100 
     3  100 100 
     4  100 100 
     5  50 50 
     6  50 50 
     7  50 50 
     8  50 50 
     9  50 50 
     10  50 50 
0

miałem problemy z tym samym numerze, kod w poprzednich odpowiedziach nie działa w moim dataframes. Mają 2 kolumny indeksu, a operacja reindexu powoduje, że wartości NaN pojawiają się w dziwnych miejscach (opublikuję zawartość ramek danych, jeśli ktoś zechce to debugować).

Znalazłem alternatywne rozwiązanie. Mam nadzieję ożywienia ten wątek może to być przydatne dla innych:

# concatenate df_a and df_b 
df_c = concat([dfbd,dfplanilhas]) 

# clears the indexes (turns the index columns into regular dataframe columns) 
df_c.reset_index(inplace='True') 

# removes duplicates keeping the last occurence (hence updating df_a with values from df_b) 
df_c.drop_duplicates(subset=['df_a','df_b'], take_last='True', inplace='True') 

Nie bardzo eleganckie rozwiązanie, ale wydaje się działać.

Mam nadzieję df.update dostaje „” zewnętrzny opcję JOIN = wkrótce ...

Powiązane problemy