मेरे पास एक डेटा सेट है जिसे मैं साफ कर रहा हूं और इसे साफ करने के लिए मुझे कुछ डेटा को सारांशित करने के लिए इसे एक पिवट टेबल में रखना होगा। अब मैं इसे वापस डेटाफ्रेम में डाल रहा हूं ताकि मैं इसे कुछ अन्य डेटाफ्रेम के साथ मर्ज कर सकूं। df1 कुछ इस तरह दिखता है:

    Count   Region              Period      ACV  PRJ
    167     REMAINING US WEST   3/3/2018    5    57
    168     REMAINING US WEST   3/31/2018   10   83
    169     SAN FRANCISCO       1/13/2018   99   76
    170     SAN FRANCISCO       1/20/2018   34   21

Df2 कुछ इस तरह दिखता है:

Count  MKTcode  Region
11     RSMR0    REMAINING US SOUTH
12     RWMR0    REMAINING US WEST
13     SFR00    SAN FRANCISCO

मैंने उन्हें इस कोड के साथ विलय करने का प्रयास किया है:

df3 = pd.merge(df1, df2, on='Region', how='inner')

लेकिन किसी कारण से पांडा एक ही डेटा के रूप में क्षेत्र के कॉलम की व्याख्या नहीं कर रहे हैं और मर्ज MKTcode कॉलम में NaN डेटा को बदल रहा है और ऐसा लगता है कि यह df2 को df1 में जोड़ रहा है, जैसे:

Count  Region             Period    ACV             PRJ         MKTcode
193 WASHINGTON, D.C.    3/3/2018    36               38             NaN
194 WASHINGTON, D.C.    3/31/2018   12                3             NaN
195 ATLANTA              NaN        NaN             NaN           ATMR0
196 BOSTON               NaN        NaN             NaN           B2MRN

मैंने आंतरिक और बाहरी जुड़ने की कोशिश की है, लेकिन वास्तविक समस्या यह प्रतीत होती है कि पांडा प्रत्येक डेटाफ्रेम के क्षेत्र कॉलम को विभिन्न तत्वों के रूप में व्याख्या कर रहा है। डीएफ 2 में एमकेटीकोड कॉलम और रीजन कॉलम में केवल 12 अवलोकन हैं और प्रत्येक अवलोकन केवल एक बार होता है, जबकि डीएफ 1 में रीजन कॉलम (उसी शहर के गुणक) में कई दोहराए जाने वाले उदाहरण हैं। क्या कोई ऐसा तरीका है जहां मैं केवल उन १२ एमकेटीकोड्स की एक सूची बना सकता हूं जिनकी मुझे आवश्यकता है और एक मर्ज निष्पादित करें जहां यह मेरे द्वारा निर्दिष्ट प्रत्येक क्षेत्र से मेल खाता हो? एक से कई मैच की तरह?

धन्यवाद।

2
CharlesD 9 मई 2018, 21:20

1 उत्तर

सबसे बढ़िया उत्तर

जब मर्ज अपेक्षानुसार काम नहीं कर रहा हो, तो सबसे पहले आपत्तिजनक कॉलम को देखें।

ज्यादातर मामलों में सबसे बड़ा अपराधी पीछे/अग्रणी रिक्त स्थान हैं। इन्हें आमतौर पर तब पेश किया जाता है जब डेटाफ्रेम को फाइलों से गलत तरीके से पढ़ा जाता है।

अतिरिक्त व्हाइटस्पेस वर्णों को अलग करके उनसे छुटकारा पाने का प्रयास करें। मान लें कि आपको "क्षेत्र" कॉलम में शामिल होने की आवश्यकता है, उपयोग करें

for df in (df1, df2):
    # Strip the column(s) you're planning to join with
    df['Region'] = df['Region'].str.strip()

अब, विलय को उम्मीद के मुताबिक काम करना चाहिए,

pd.merge(df1, df2, on='Region', how='inner')

   Count_x             Region     Period  ACV  PRJ  Count_y MKTcode
0      167  REMAINING US WEST   3/3/2018    5   57       12   RWMR0
1      168  REMAINING US WEST  3/31/2018   10   83       12   RWMR0
2      169      SAN FRANCISCO  1/13/2018   99   76       13   SFR00
3      170      SAN FRANCISCO  1/20/2018   34   21       13   SFR00

यदि आप अभी भी NaN प्राप्त कर रहे हैं, तो एक अन्य संभावना व्हाट्सएप वर्णों में अंतर के बीच शब्दों के कारण हो सकती है। उदाहरण के लिए, 'REMAINING US WEST' की तुलना 'REMAINING US WEST' के बराबर नहीं की जाएगी।

इस बार, str.replace का उपयोग करना ठीक है:

for df in (df1, df2):
    df['Region'] = df['Region'].str.replace(r'\s+', ' ')
7
cs95 14 जून 2019, 19:18