2012-08-31 14 views
5

varsayalım Ben iki veri çerçevesi 'df_a' & 'df_b', her ikisi de aynı indeks yapısı ve sütunları var, ama iç veri öğelerinden bazılarını farklıdır:Veri parçası öğesini Python Panda'larda başka bir veri çerçevesiyle nasıl değiştirebilir ve ekleyebilirim?

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

Ve şimdi elemanını değiştirmek istiyor df_a, aynı (dizin, sütun) koordinatına sahip olan df_b öğesi ile df_a'nın kapsamı dışında olan (dizin, sütun) koordinatları olan df_b öğelerini ekler.

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

Nasıl 'yama (df_a, df_b)' işlevi yazmak için: Sadece 'df_a' için bir yama 'df_b' eklemek ister?

+0

Bu henüz uygulanmadı df_a.update için kullanma dosyası (df_b, = 'dış' katılmak), bkz yardım benziyor (df_a.update) –

+0

Bu sadece 'combine_first' (aşağıya değil) değil mi? –

cevap

1

:

# 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

Sanırım 2. hat 'df_a.index' zaten df_b.index' – Winand

+0

@Winand Doğru içeriyor. Onardım. –

2

bu deneyin:

, ancak daha fazla esneklik ile BrenBarn cevabı Benzer
df_c = df_a.reindex(df_a.index | df_b.index) 
df_c.ix[df_b.index] = df_b 
2

diğerinden değerler (hatta tam satırlar) ile bir dataframe boşlukları doldurmak için, bir alacak df.combine_first() yerleşik yöntemine bakın.

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

Aynı sorunla uğraşıyordum, önceki yanıtlardaki kodlar veri tabanlarında çalışmadı. 2 indeks sütunu vardır ve reindex işlemi garip yerlerde NaN değerleriyle sonuçlanır (eğer birisi varsa hata ayıklama yaparsa, veri çerçevesi içeriklerini kaydederim).

Alternatif bir çözüm buldum. Bu başkalarına yararlı olabilir umuduyla Konuyu canlandırılması ediyorum:

# 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') 

Değil çok şık bir çözüm, ancak iş gibi görünüyor.

Ben df.update yakında katılmak = 'dış' seçeneğini alır umut ...

İlgili konular