2 डेटाफ्रेम को मर्ज करने की कोशिश कर रहा है, लेकिन ValueError प्राप्त करें


85

ये दो चर में सहेजे गए मेरे दो डेटाफ्रेम हैं:

> print(df.head())
>
          club_name  tr_jan  tr_dec  year
    0  ADO Den Haag    1368    1422  2010
    1  ADO Den Haag    1455    1477  2011
    2  ADO Den Haag    1461    1443  2012
    3  ADO Den Haag    1437    1383  2013
    4  ADO Den Haag    1386    1422  2014
> print(rankingdf.head())
>
           club_name  ranking  year
    0    ADO Den Haag    12    2010
    1    ADO Den Haag    13    2011
    2    ADO Den Haag    11    2012
    3    ADO Den Haag    14    2013
    4    ADO Den Haag    17    2014

मैं इस कोड का उपयोग करके इन दोनों को मर्ज करने की कोशिश कर रहा हूं:

new_df = df.merge(ranking_df, on=['club_name', 'year'], how='left')

कैसे = 'बाएं' को जोड़ा जाता है, क्योंकि मेरे मानक df की तुलना में मेरी रैंकिंग_df में कम डाटापॉइंट हैं।

अपेक्षित व्यवहार इस प्रकार है:

> print(new_df.head()) 
> 

      club_name  tr_jan  tr_dec  year    ranking
0  ADO Den Haag    1368    1422  2010    12
1  ADO Den Haag    1455    1477  2011    13
2  ADO Den Haag    1461    1443  2012    11
3  ADO Den Haag    1437    1383  2013    14
4  ADO Den Haag    1386    1422  2014    17

लेकिन मुझे यह त्रुटि मिली:

ValueError: आप ऑब्जेक्ट और int64 कॉलम पर मर्ज करने का प्रयास कर रहे हैं। यदि आप आगे बढ़ना चाहते हैं तो आपको pd.concat का उपयोग करना चाहिए

लेकिन मैं कंकड़ का उपयोग नहीं करना चाहता हूं क्योंकि मैं पेड़ों को मर्ज करना चाहता हूं न कि उन्हें बस जोड़ना चाहिए।

एक और व्यवहार जो मेरे दिमाग में अजीब है, वह यह है कि मेरा कोड काम करता है अगर मैं पहले df को .csv पर सहेजता हूं और फिर .csv को डेटाफ्रेम में लोड करता हूं।

उस के लिए कोड:

df = pd.DataFrame(data_points, columns=['club_name', 'tr_jan', 'tr_dec', 'year'])
df.to_csv('preliminary.csv')

df = pd.read_csv('preliminary.csv', index_col=0)

ranking_df = pd.DataFrame(rankings, columns=['club_name', 'ranking', 'year'])

new_df = df.merge(ranking_df, on=['club_name', 'year'], how='left')

मुझे लगता है कि इसे index_col = 0 पैरामीटर के साथ करना है। लेकिन मुझे इसे बचाने के बिना इसे ठीक करने का कोई विचार नहीं है, यह बहुत ज्यादा मायने नहीं रखता है लेकिन एक तरह का झुंझलाहट है जो मुझे करना पड़ता है।


एक ही त्रुटि है जब मैं मर्ज के बजाय शामिल होने का उपयोग किया है।
मोडम राकेश गौड़

जवाबों:


116

आपके डेटाफ़्रेम में से एक में वर्ष एक स्ट्रिंग है और दूसरा यह एक df['year']=df['year'].astype(int)इंट 64 है जिसे आप इसे पहले रूपांतरित कर सकते हैं और फिर जुड़ सकते हैं (उदाहरण के लिए या जैसा कि राफेलसी ने सुझाव दिया है df.year.astype(int))

संपादित करें: एंडरसन झू की टिप्पणी पर भी ध्यान दें: यदि आपके किसी Noneडेटाफ़्रेम में आपके पास या गुम मान हैं, तो आपको Int64इसके बजाय उपयोग करने की आवश्यकता है int। संदर्भ यहाँ देखें ।


धन्यवाद यह काम किया। किंड्स के रूप में हर साल मुझे बचाने के बाद से अजीब अजीब।
परेज

13
क्यों नहीं df.year.astype(int)?
राफेलक

मैंने अंततः इसे दूसरे तरीके से ठीक किया, बस सभी वर्ष चर को डेटा-फ्रेम में पूर्णांक के रूप में सहेजा। कभी नहीं लगा कि वे तार थे।
पेरेसज

@ राफेलक शायद बेहतर है
अर्नोन रोटेम-गल-ओज़

2
बस अगर आपके किसी डेटाफ़्रेम में कोई भी या अनुपलब्ध मान नहीं है, तो आपको Int64इसके बजाय उपयोग करने की आवश्यकता है int। संदर्भ देखें यहाँ
एंडरसन झू

42

मैंने पाया कि मेरे dfs दोनों में एक ही प्रकार का कॉलम था ( str) लेकिन समस्या joinको mergeहल करने से स्विच करना ।


7
मुझे भी। अगर कोई जानता है कि क्यों, कृपया नीचे लिखें :)
raummensch

वही। वास्तव में बहुत अजीब है, मेरा एकमात्र अनुमान यह है कि भले ही सब कुछ प्रकार का हो object, जब ज्वाइनिंग पांडा एक बार और अधिक अनुमानित रूप से डेटा प्रकारों का मूल्यांकन करने की कोशिश करता है ... लेकिन मर्ज ने इसे मेरे लिए भी हल कर दिया।
15 स्टे

6
@raummensch और @ 15Step, मुझे भी यही समस्या थी। मर्ज स्ट्रिंग्स पर क्यों काम करता है इसका कारण @MatthiasFripp द्वारा उत्तर में यहां नहीं पाया जा सकता है: लिंक । मूल रूप से df1.join(df2)हमेशा के सूचकांक के माध्यम से विलीन हो जाती है df2, जबकि df1.merge(df2)स्तंभ पर मर्ज हो जाएंगे। इसलिए मूल रूप से हम एक तार और पूर्णांक के आधार पर विलय करने की कोशिश कर रहे थे, भले ही दोनों स्तंभ तार थे ..
निको

3

यह तब होता है जब दोनों तालिका में सामान्य स्तंभ अलग-अलग डेटा प्रकार के होते हैं।

उदाहरण: तालिका 1 में, आपके पास स्ट्रिंग के रूप में तारीख है जबकि तालिका 2 में आपके पास डेटटाइम के रूप में तारीख है । इसलिए विलय से पहले, हमें तारीख बदलकर सामान्य डेटा प्रकार की आवश्यकता है।


2

@Arnon Rotem-Gal-Oz का उत्तर अधिकांश भाग के लिए सही है। लेकिन मैं df['year']=df['year'].astype(int)और के बीच के अंतर को इंगित करना चाहूंगा df.year.astype(int)df.year.astype(int)डेटाफ्रेम का एक दृश्य देता है और स्पष्ट रूप से प्रकार नहीं बदलता है, कम से कम पांडा में 0.24.2। df['year']=df['year'].astype(int)स्पष्ट रूप से प्रकार बदलें क्योंकि यह एक असाइनमेंट है। मैं तर्क दूंगा कि किसी कॉलम के dtype को स्थायी रूप से बदलने का यह सबसे सुरक्षित तरीका है।

उदाहरण:

df = pd.DataFrame({'Weed': ['green crack', 'northern lights', 'girl scout cookies'], 'Qty':[10,15,3]}) df.dtypes

खरपतवार वस्तु, मात्रा int64

df['Qty'].astype(str) df.dtypes

खरपतवार वस्तु, मात्रा int64

यहां तक ​​कि इनग्रेग अरग को ट्रू में सेट करने से कई बार मदद नहीं मिलती है। मुझे नहीं पता कि ऐसा क्यों होता है। ज्यादातर मामलों में inplace = true एक स्पष्ट असाइनमेंट के बराबर है।

df['Qty'].astype(str, inplace = True) df.dtypes

खरपतवार वस्तु, मात्रा int64

अब असाइनमेंट,

df['Qty'] = df['Qty'].astype(str) df.dtypes

खरपतवार वस्तु, मात्रा वस्तु


1

अतिरिक्त: जब आप dcs से .csv प्रारूप में सहेजते हैं, तो डेटाटाइम (इस विशिष्ट मामले में वर्ष) को ऑब्जेक्ट के रूप में सहेजा जाता है, इसलिए आपको मर्ज करते समय इसे पूर्णांक (इस विशिष्ट मामले में वर्ष) में परिवर्तित करने की आवश्यकता होती है। इसीलिए जब आप csv फ़ाइलों से दोनों df अपलोड करते हैं, तो आप आसानी से मर्ज कर सकते हैं, जबकि उपरोक्त त्रुटि तब दिखाई देगी जब एक df को csv फ़ाइलों से अपलोड किया गया है और दूसरा मौजूदा df से है। यह कुछ हद तक कष्टप्रद है, लेकिन एक आसान उपाय है यदि ध्यान में रखा जाए।


0

यह सरल समाधान मेरे लिए काम करता है

    final = pd.concat([df, rankingdf], axis=1, sort=False)

लेकिन आपको पहले कुछ डुप्लिकेट कॉलम को छोड़ने की आवश्यकता हो सकती है।


0

पहले उन स्तंभों के प्रकार की जाँच करें जिन्हें आप मर्ज करना चाहते हैं। आप देखेंगे उनमें से एक स्ट्रिंग है जहां अन्य एक है int। फिर इसे कोड के रूप में int में बदलें:

df["something"] = df["something"].astype(int)

merged = df.merge[df1, on="something"]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.