2012-08-31 10 views
5

मान लीजिए मैं दो डेटा फ्रेम 'df_a' & 'df_b', दोनों एक ही सूचकांक संरचना और कॉलम है, लेकिन अंदर डेटा तत्वों में से कुछ अलग हैं:पाइथन पांडस में किसी अन्य डेटाफ्रेम द्वारा डेटाफ्रेम तत्व को प्रतिस्थापित और जोड़ने के लिए कैसे?

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

और अब मैं तत्व बदलना चाहते हैं df_a के तत्व द्वारा df_b का एक ही (इंडेक्स, कॉलम) समन्वय होता है, और df_b के तत्वों को संलग्न करता है जिनके (अनुक्रमणिका, कॉलम) 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 

कैसे 'पैच (df_a, df_b)' समारोह में लिखने के लिए: बस 'df_a' के लिए एक पैच 'df_b' जोड़ने पसंद है?

+0

यह अभी तक लागू नहीं df_a.update के लिए एक उपयोग के मामले (df_b, = 'बाहरी' में शामिल होने), देखने के मदद की तरह दिखता है (df_a.update) –

+0

क्या यह सिर्फ 'combine_first' (नीचे प्रति) नहीं है? –

उत्तर

1

BrenBarn का जवाब है, लेकिन अधिक लचीलेपन के साथ करने के लिए समान:

# 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

मुझे लगता है कि दूसरी पंक्ति 'df_a.index' में पहले से ही' df_b.index' – Winand

+0

@Winand सही शामिल है। मैंने ठीक कर दिया। –

2

इस प्रयास करें:

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

दूसरे से मूल्यों (या यहां तक ​​कि पूर्ण पंक्तियाँ) के साथ एक dataframe में अंतराल को भरने के लिए, एक ले अंतर्निहित विधि 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

मैं एक ही मुद्दे से संघर्ष कर रहा था, पिछले उत्तरों में कोड मेरे डेटाफ्रेम में काम नहीं करता था। उनके पास 2 इंडेक्स कॉलम हैं और अजीब स्थानों में NaN मानों में रीइंडेक्स ऑपरेशन परिणाम हैं (यदि कोई भी इसे डिबग करने के इच्छुक है तो मैं डेटाफ्रेम सामग्री पोस्ट करूंगा)।

मुझे एक वैकल्पिक समाधान मिला। मैं इस सूत्र उम्मीद कर इस दूसरों के लिए उपयोगी हो सकता है को पुनर्जीवित कर रहा हूँ:

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

नहीं एक बहुत ही सुंदर समाधान है, लेकिन काम करने के लिए लगता है।

मुझे आशा है कि जल्द ही एक df.update = में शामिल होने के 'बाहरी' विकल्प हो जाता है ...

संबंधित मुद्दे