2012-03-20 28 views
20

में ओवरराइट के साथ जुड़ें या विलय करें मैं डेटाटाइम इंडेक्स के साथ डेटाफ्रेम पर एक जॉइन/मर्ज/एपेंड ऑपरेशन करना चाहता हूं।पांडा

मान लें कि मेरे पास df1 है और मैं इसे df2 जोड़ना चाहता हूं। df2 में कम या अधिक कॉलम हो सकते हैं, और ओवरलैपिंग इंडेक्स हो सकते हैं। सभी पंक्तियों के लिए जहां इंडेक्स मेल खाते हैं, यदि df2 में df1 के समान कॉलम है, तो मुझे df1 के मान df2 से ओवरराइट किए जाने चाहिए।

मैं वांछित परिणाम कैसे प्राप्त कर सकता हूं?

उत्तर

22

कैसे: df2.combine_first(df1)?

In [33]: df2 
Out[33]: 
        A   B   C   D 
2000-01-03 0.638998 1.277361 0.193649 0.345063 
2000-01-04 -0.816756 -1.711666 -1.155077 -0.678726 
2000-01-05 0.435507 -0.025162 -1.112890 0.324111 
2000-01-06 -0.210756 -1.027164 0.036664 0.884715 
2000-01-07 -0.821631 -0.700394 -0.706505 1.193341 
2000-01-10 1.015447 -0.909930 0.027548 0.258471 
2000-01-11 -0.497239 -0.979071 -0.461560 0.447598 

In [34]: df1 
Out[34]: 
        A   B   C 
2000-01-03 2.288863 0.188175 -0.040928 
2000-01-04 0.159107 -0.666861 -0.551628 
2000-01-05 -0.356838 -0.231036 -1.211446 
2000-01-06 -0.866475 1.113018 -0.001483 
2000-01-07 0.303269 0.021034 0.471715 
2000-01-10 1.149815 0.686696 -1.230991 
2000-01-11 -1.296118 -0.172950 -0.603887 
2000-01-12 -1.034574 -0.523238 0.626968 
2000-01-13 -0.193280 1.857499 -0.046383 
2000-01-14 -1.043492 -0.820525 0.868685 

In [35]: df2.comb 
df2.combine  df2.combineAdd  df2.combine_first df2.combineMult  

In [35]: df2.combine_first(df1) 
Out[35]: 
        A   B   C   D 
2000-01-03 0.638998 1.277361 0.193649 0.345063 
2000-01-04 -0.816756 -1.711666 -1.155077 -0.678726 
2000-01-05 0.435507 -0.025162 -1.112890 0.324111 
2000-01-06 -0.210756 -1.027164 0.036664 0.884715 
2000-01-07 -0.821631 -0.700394 -0.706505 1.193341 
2000-01-10 1.015447 -0.909930 0.027548 0.258471 
2000-01-11 -0.497239 -0.979071 -0.461560 0.447598 
2000-01-12 -1.034574 -0.523238 0.626968  NaN 
2000-01-13 -0.193280 1.857499 -0.046383  NaN 
2000-01-14 -1.043492 -0.820525 0.868685  NaN 

ध्यान दें कि यह सूचकांक कि df2 से मेल नहीं के लिए df1 से मान लेता है। यदि यह वही नहीं करता जो आप चाहते हैं तो मैं इस फ़ंक्शन/एड विकल्प को बेहतर बनाने के इच्छुक हूं।

+0

मुझे लगता है कि यह वास्तव में वही है जो मैं चाहता हूं, बहुत बहुत धन्यवाद। – saroele

+0

'combine_first' के साथ कोई समस्या है - कुछ 30k पंक्तियों के तीन डेटा फ्रेम को गठबंधन करने के लिए इसका उपयोग करके मेरी सभी मेमोरी ओवरटेक हो जाती है। इस के आसपास किसी भी तरह से? – scry

+0

मुझे लगता है कि यह कार्यक्षमता अधिक सहज होगी यदि यह कार्यक्षमता वैकल्पिक तर्क 'join =' outer 'के साथ 'df.update'-function का हिस्सा थी (वर्तमान में केवल' बाएं 'लागू किया गया है)। मेरे मामले में, 'df2' ('df1' से गणना की गई) में' df1' (लेकिन कुछ जो 'df1' में नहीं हैं) की तुलना में बहुत कम कॉलम हैं, और मैं जहां संभव हो वहां गणना किए गए मानों के साथ' df1' अपडेट करना चाहता हूं साथ ही अतिरिक्त कॉलम। इसके लिए, मुझे लगता है कि 'df1.update (df2, join =' outer ')' df1 = df2.combine_first (df1) 'से समझना बहुत आसान होगा। पीएस। यह एक मामूली क्विबल है, लेकिन अन्यथा 'पांडा' लगभग पूरी तरह से कमाल है! =) – Axel

6

इस तरह के विलय के लिए, update डेटाफ्रेम का तरीका उपयोगी है। df2 से डेटा के साथ

>>> df1 
    0 1 2 
0 NaN 3.0 5.0 
1 -4.6 NaN NaN 
2 NaN 7.0 NaN 
>>> 
>>> df2 
     0 1 2 
1 -42.6 NaN -8.2 
2 -5.0 1.6 4.0 

आइए अद्यतन df1:

documentation से उदाहरण ले रहा है:

import pandas as pd 
import numpy as np 

df1 = pd.DataFrame([[np.nan, 3., 5.], [-4.6, np.nan, np.nan], 
        [np.nan, 7., np.nan]]) 
df2 = pd.DataFrame([[-42.6, np.nan, -8.2], [-5., 1.6, 4]], 
        index=[1, 2]) 

डाटा update से पहले

df1.update(df2) 

अपडेट के बाद डाटा:

>>> df1 
     0 1 2 
0 NaN 3.0 5.0 
1 -42.6 NaN -8.2 
2 -5.0 1.6 4.0 

टिप्पणी:

  • यह सूचना के लिए है कि यह एक ऑपरेशन "स्थान पर" है, DataFrame कि update कॉल को संशोधित करने के लिए महत्वपूर्ण है।
+3

यह 'combine_first' से अधिक सहज है क्योंकि यह ठीक से' अद्यतन 'विधि के रूप में कार्य करता है जिसे हम डिक्ट्स से जानते हैं। – saroele

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