পান্ডাস মার্জ করার সময় কীভাবে সূচী রাখা যায়


126

আমি দুটি সংহত করতে চাই DataFramesএবং প্রথম ফ্রেম থেকে সূচিটিকে মার্জ করা ডেটাसेटে সূচি হিসাবে রাখতে চাই । যাইহোক, আমি যখন মার্জটি করি তখন ফলাফল ডেটাফ্রেমের পূর্ণসংখ্যার সূচক থাকে। আমি কীভাবে উল্লেখ করতে পারি যে আমি বাম ডেটা ফ্রেম থেকে সূচিটি রাখতে চাই?

In [4]: a = pd.DataFrame({'col1': {'a': 1, 'b': 2, 'c': 3}, 
                          'to_merge_on': {'a': 1, 'b': 3, 'c': 4}})

In [5]: b = pd.DataFrame({'col2': {0: 1, 1: 2, 2: 3}, 
                          'to_merge_on': {0: 1, 1: 3, 2: 5}})

In [6]: a
Out[6]:
   col1  to_merge_on
a     1            1
b     2            3
c     3            4

In [7]: b
Out[7]:
   col2  to_merge_on
0     1            1
1     2            3
2     3            5

In [8]: a.merge(b, how='left')
Out[8]:
   col1  to_merge_on  col2
0     1            1   1.0
1     2            3   2.0
2     3            4   NaN

In [9]: _.index
Out[9]: Int64Index([0, 1, 2], dtype='int64')

সম্পাদনা: উদাহরণ কোডে স্যুইচ করা হয়েছে যা সহজেই পুনরুত্পাদন করা যায়


2
আপনি যদি একটি নির্দিষ্ট কলামে মার্জ করেন তবে কোন সূচকগুলি ব্যবহার করবেন তা স্পষ্ট নয় (যদি তারা উভয়ই আলাদা হয়)।
বোনবো

উত্তর:


161
In [5]: a.reset_index().merge(b, how="left").set_index('index')
Out[5]:
       col1  to_merge_on  col2
index
a         1            1     1
b         2            3     2
c         3            4   NaN

দ্রষ্টব্য: কিছু বাম মার্জ অপারেশনের জন্য যদি এর মধ্যে একাধিক ম্যাচ থাকে তবে আপনি আরও সারি দিয়ে শেষ করতে পারেন a এবং bএবং আপনি deduplicate করার জন্য (প্রয়োজন হবে ডিডুপ্লিকেশান ডকুমেন্টেশন )। এই কারণেই পান্ডাস আপনার জন্য সূচি রাখে না।


4
খুব চালাক. a.mers (b, how = "বাম")। সেট_ইন্ডেক্স (a.index) এছাড়াও কাজ করে, তবে এটি কম দৃ seems় বলে মনে হয় (যেহেতু এর প্রথম অংশটি পুনরায় সেট করার আগে সূচকের মান
হারাতে পারে

11
এই বিশেষ ক্ষেত্রে, এটি সমতুল্য। তবে অনেকগুলি মার্জ অপারেশনের জন্য, ফলস ফ্রেমটিতে মূল aফ্রেমের তুলনায় সারিগুলির সমান সংখ্যা নেই । রিসেট_ইন্ডেক্স সূচকে একটি নিয়মিত কলামে নিয়ে যায় এবং সংযুক্তির পরে এই কলামটি থেকে set_index এছাড়াও যত্ন নেয় যখন মার্জের ক্রিয়াকলাপের কারণে সারিগুলি সদৃশ / মুছে ফেলা হয়।
ওয়াউটার ওভারমায়ার

1
@ ওয়েস্টার আমি কেন বাম মার্জগুলি ডিফল্টরূপে পুনরায় সূচি বোধ করি তা জানতে আগ্রহী। আমি কোথায় আরও শিখতে পারি?
ম্যাথু

7
নিস! আমি যে সূচক-নামটি ব্যবহার করি তা স্পষ্টভাবে উল্লেখ করা এড়াতে a.reset_index().merge(b, how="left").set_index(a.index.names)
ট্রুলস

3
পান্ডারা খারাপভাবে ভাবলেন এপিআই আবার স্ট্রাইক করে।
হেনরি হেনরিসন 21

7

আপনি বাম ডেটাফ্রেমে সূচীর অনুলিপি তৈরি করতে পারেন এবং মার্জ করতে পারেন।

a['copy_index'] = a.index
a.merge(b, how='left')

বড় ডেটাফ্রেমে কাজ করার সময় এবং pd.merge_asof()(বা) ব্যবহার করার সময় আমি এই সহজ পদ্ধতিটি খুব দরকারী বলে মনে করেছিdd.merge_asof() ) ।

পুনঃনির্ধারণ সূচক ব্যয়বহুল (বৃহত ডেটাফ্রেম) হলে এই পদ্ধতিটি উন্নত হবে।


1
এটি সেরা উত্তর। একত্রীকরণের সময় আপনি নিজের পুরানো সূচিগুলি সংরক্ষণ করতে চান এমন অনেকগুলি কারণ রয়েছে (এবং স্বীকৃত উত্তর সূচীগুলি সংরক্ষণ করে না, এটি কেবল সেগুলি পুনরায় সেট করে)। আপনি যখন 2 টিরও বেশি ডেটাফ্রেমগুলি একত্রিত করার চেষ্টা করছেন এবং এর ফলে এটি সহায়তা করে ...
মঙ্গল

2
সূক্ষ্ম নামটি (মূল) সূচকের নামটি সংরক্ষণের সাথে সর্বোত্তম সমাধান
মার্টিয়েন লুবারিংক

আপভোটেড তবে কেবল সতর্ক থাকুন, মাল্টি-ইনডেক্স ব্যবহার করার সময়, আপনার সূচকগুলি একটি [কপি_ইন্ডেক্স] নামক একক কলামে একটি টিউপল হিসাবে সংরক্ষণ করা হবে
ek: ১৯৯৯ এ গিকিধারার্স ek

6

একটি নন-পিডি.মেজার সমাধান রয়েছে। ব্যবহার mapএবংset_index

In [1744]: a.assign(col2=a['to_merge_on'].map(b.set_index('to_merge_on')['col2']))
Out[1744]:
   col1  to_merge_on  col2
a     1            1   1.0
b     2            3   2.0
c     3            4   NaN

এবং, indexসূচকের জন্য একটি ডামি নাম প্রবর্তন করে না ।


1
এটি গৃহীত উত্তরের তুলনায় উচ্চতর বলে মনে হচ্ছে কারণ এটি মাল্টি সূচকের মতো প্রান্তের ক্ষেত্রে সম্ভবত আরও ভাল কাজ করবে। কেউ কি এটার উপর মন্তব্য করতে পার?
বলপয়েন্টবেন

1
প্রশ্ন, আপনি যদি একাধিক কলামগুলি বরাদ্দ করতে চান তবে কী এই পদ্ধতির কাজ হবে বা এটি কেবল 1 টি ক্ষেত্রে সীমাবদ্ধ?
ইউকা

@ ইউকা: এটি সম্ভবত একাধিক কলামগুলির সাথে কাজ করবে না, যেহেতু আপনি একাধিক কলামগুলি সাবসেট করবেন তখন আপনি একটি pd.Dataframeএবং একটি দিয়ে শেষ করবেন না pd.Series.map()পদ্ধতি শুধুমাত্র সংজ্ঞায়িত করা হয় pd.Series। এর অর্থ এই যে: a[['to_merge_on_1', 'to_merge_on_2']].map(...)কাজ করবে না।
ডেটাম্যান

4
df1 = df1.merge(
        df2, how="inner", left_index=True, right_index=True
    )

এটি df1 এর সূচক সংরক্ষণ করতে দেয়


এটা কাজ মনে হয়, কিন্তু যখন আমি সঙ্গে এটি ব্যবহার on=list_of_cols], এটা ডকুমেন্টেশন contradicts: If joining columns on columns, the DataFrame indexes *will be ignored*। সূচক বনাম কলামগুলির মধ্যে একটির কি প্রাধান্য রয়েছে?
ইটামার কাটজ

0

ভাবুন আমি একটি ভিন্ন সমাধান নিয়ে এসেছি। আমি ইনডেক্সের মান বাম টেবিল এবং বাম সারণির সূচক অফ অফ সূচক ভিত্তিতে একটি কলাম মান ডান টেবিল যোগদান ছিল। আমি যা করেছি তা ছিল একটি সাধারণ মার্জ:

First10ReviewsJoined = pd.merge(First10Reviews, df, left_index=True, right_on='Line Number')

তারপরে আমি সংযুক্ত টেবিল থেকে নতুন সূচক নম্বরগুলি পুনরুদ্ধার করেছি এবং সেগুলি সেন্টিমেন্ট লাইন নম্বর নামে একটি নতুন কলামে রেখেছি:

First10ReviewsJoined['Sentiment Line Number']= First10ReviewsJoined.index.tolist()

তারপরে আমি নিজেই সূচকটিকে মূল, বাম টেবিল সূচককে পূর্ব-বিদ্যমান কলামের উপর ভিত্তি করে লাইন নম্বর (বাম টেবিল সূচী থেকে কলামের মানটিতে যোগদান করেছি) বলে সেট করেছি:

First10ReviewsJoined.set_index('Line Number', inplace=True)

তারপরে লাইন নম্বরটির সূচী নামটি সরিয়ে ফেলুন যাতে এটি ফাঁকা থাকে:

First10ReviewsJoined.index.name = None

সম্ভবত কিছুটা হ্যাক তবে ভাল এবং অপেক্ষাকৃত সহজ কাজ করছে বলে মনে হচ্ছে। এছাড়াও, অনুমান করুন এটি আপনার ডুপ্লিকেটগুলি / গণ্ডগোলের ঝুঁকি হ্রাস করে। আশা করি যে সমস্ত বোঝা যায়।


0

আর একটি সহজ বিকল্প হ'ল আগে যা ছিল তার সূচকটির নামকরণ:

a.merge(b, how="left").set_axis(a.index)

মার্জটি ডাটাফ্রেমে অর্ডার সংরক্ষণ করে 'এ', তবে কেবল সূচকটি পুনরায় সেট করে তাই সেট_এক্সিস ব্যবহারের জন্য সংরক্ষণ করা হয়

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.