পান্ডসে যোগদান এবং একত্রীকরণের মধ্যে পার্থক্য কী?


208

ধরুন আমার কাছে এর মতো দুটি ডেটা ফ্রেম রয়েছে:

left = pd.DataFrame({'key1': ['foo', 'bar'], 'lval': [1, 2]})

right = pd.DataFrame({'key2': ['foo', 'bar'], 'rval': [4, 5]})

আমি তাদের একীভূত করতে চাই, তাই আমি এরকম কিছু চেষ্টা করি:

pd.merge(left, right, left_on='key1', right_on='key2')

এবং আমি খুশি

    key1    lval    key2    rval
0   foo     1       foo     4
1   bar     2       bar     5

তবে আমি যোগদানের পদ্ধতিটি ব্যবহার করার চেষ্টা করছি, যা আমি বিশ্বাস করতে পরিচালিত করেছি বেশ অনুরূপ।

left.join(right, on=['key1', 'key2'])

এবং আমি এটি পেয়েছি:

//anaconda/lib/python2.7/site-packages/pandas/tools/merge.pyc in _validate_specification(self)
    406             if self.right_index:
    407                 if not ((len(self.left_on) == self.right.index.nlevels)):
--> 408                     raise AssertionError()
    409                 self.right_on = [None] * n
    410         elif self.right_on is not None:

AssertionError: 

আমি কী মিস করছি?


4
নির্দিষ্ট সমস্যা এখানে যে mergeএর কলাম যোগদান leftএর কলামকে rightযা আপনি যা চান তা, কিন্তু join(... on=[...])এর কলাম যোগদান leftসূচী কীগুলিকে right, যা নয় কি আপনি চান। আরও তথ্যের জন্য নীচে আমার উত্তর দেখুন।
ম্যাথিয়াস ফ্রিপ 21

3
ডেটাফ্রেম.জোঁইন () সর্বদা কলারের সূচি বা কীগুলির সাথে ( onবিকল্পের সাহায্যে নির্দিষ্ট করা ) এর সূচকগুলির সাথে মিল রাখতে চায় other। মনে রাখবেন, যোগদানের জন্য সূচকগুলি। যদিও মার্জ () একটি আরও সাধারণ পদ্ধতি।
জিয়াপেং ঝাং

উত্তর:


87

আমি সবসময় joinসূচকগুলিতে ব্যবহার করি :

import pandas as pd
left = pd.DataFrame({'key': ['foo', 'bar'], 'val': [1, 2]}).set_index('key')
right = pd.DataFrame({'key': ['foo', 'bar'], 'val': [4, 5]}).set_index('key')
left.join(right, lsuffix='_l', rsuffix='_r')

     val_l  val_r
key            
foo      1      4
bar      2      5

mergeনিম্নলিখিত কলামগুলিতে ব্যবহার করে একই কার্যকারিতাটি পাওয়া যেতে পারে :

left = pd.DataFrame({'key': ['foo', 'bar'], 'val': [1, 2]})
right = pd.DataFrame({'key': ['foo', 'bar'], 'val': [4, 5]})
left.merge(right, on=('key'), suffixes=('_l', '_r'))

   key  val_l  val_r
0  foo      1      4
1  bar      2      5

ত্রুটিটি বলে যাচ্ছে বলে মনে হচ্ছে যে এটি মাল্টি ইনডেক্সটি rightদৈর্ঘ্যের সমান গভীরতার সাথে প্রত্যাশা করে on। এটা আমার সাজানোর জন্য বোধগম্য। আমি গ্রহণ করতে পারি যে শব্দার্থবিজ্ঞান আলাদা। কিন্তু আমি যদি আমি সঙ্গে df.join যে একই আচরণ পেতে পারেন জানতে চাই
munk

345

pandas.merge() সমস্ত মার্জ / যোগদানের আচরণের জন্য ব্যবহৃত অন্তর্নিহিত ফাংশন।

এর ডেটাফ্রেমগুলি এর সক্ষমতা অ্যাক্সেস করার একটি সুবিধাজনক উপায় হিসাবে pandas.DataFrame.merge()এবং pandas.DataFrame.join()পদ্ধতিগুলি সরবরাহ করে pandas.merge()। উদাহরণস্বরূপ, df1.merge(right=df2, ...)সমান pandas.merge(left=df1, right=df2, ...)

এই মধ্যে মূল পার্থক্য আছে df.join()এবং df.merge():

  1. ডান টেবিলটিতে সন্ধান: df1.join(df2)সর্বদা এর সূচকের মাধ্যমে মিলিত হয় df2, তবে df1.merge(df2)এক বা একাধিক কলামে df2(ডিফল্ট) অথবা সূচকের df2(এর সাথে right_index=True) যোগ দিতে পারে।
  2. বাম টেবিলে সন্ধান: ডিফল্টরূপে, df1.join(df2)এর সূচী ব্যবহার করে df1এবং এর df1.merge(df2)কলাম (গুলি) ব্যবহার করে df1। যা নির্দিষ্ট করে df1.join(df2, on=key_or_keys)বা ওভাররাইড করা যেতে পারে df1.merge(df2, left_index=True)
  3. বাম বনাম অভ্যন্তরীণ যোগদান: বামটি df1.join(df2)ডিফল্টরূপে যোগ দেয় (সমস্ত সারি রাখে df1), তবে df.mergeএকটি অভ্যন্তরীণ ডিফল্টরূপে যোগ দেয় (কেবলমাত্র সারি df1এবং এর সারি মিলবে df2) join

সুতরাং, জেনেরিক পদ্ধতির ব্যবহার pandas.merge(df1, df2)বা হয় df1.merge(df2)। তবে বেশ কয়েকটি প্রচলিত পরিস্থিতিতে (সমস্ত সারি রেখে df1এবং কোনও সূচকে যোগ দেওয়া df2) এর df1.join(df2)পরিবর্তে আপনি কিছু টাইপ করে সংরক্ষণ করতে পারেন ।

Http://pandas.pydata.org/pandas-docs/stable/merging.html#datedia-style-dataframe-joining-merging এ ডকুমেন্টেশন থেকে এই বিষয়গুলি সম্পর্কে কিছু নোট :

merge পান্ডাস নেমস্পেসের একটি ফাংশন এবং এটি ডেটাফ্রেম উদাহরণ পদ্ধতি হিসাবে উপলভ্য, কলিং ডেটাফ্রেমকে জোড়ের মধ্যে স্পষ্টতই বাম বস্তু হিসাবে বিবেচনা করা হয়।

সম্পর্কিত DataFrame.joinপদ্ধতিটি mergeইনডেক্স-অন-ইনডেক্স এবং ইনডেক্স-অন-কলামে যোগ দেয়, তবে সাধারণ কলামগুলিতে (এর জন্য ডিফল্ট আচরণ merge) যোগদানের চেয়ে ডিফল্টরূপে সূচকে যোগ দেয় । আপনি যদি সূচকে যোগ দিচ্ছেন তবে আপনি DataFrame.joinকিছু টাইপিং নিজেকে বাঁচাতে ব্যবহার করতে চাইতে পারেন ।

...

এই দুটি ফাংশন কল সম্পূর্ণ সমতুল্য:

left.join(right, on=key_or_keys)
pd.merge(left, right, left_on=key_or_keys, right_index=True, how='left', sort=False)

18
এটি অবশ্যই গ্রহণযোগ্য উত্তর হওয়া উচিত!
থুরফের

@ মাথিয়াস ফ্রিপ্প, সম্ভবত আরও অভিজ্ঞদের জন্য এটি না বলেই চলেছে, তবে এও বলা যেতে পারে যে "ডান টেবিলের উপর নজর রাখা: df1.join (df2) df1.join (df2, on = key_or_keys) এ উপেক্ষা করা যেতে পারে?
স্পেসডাস্টপি

@ স্পিডেস্টপি, আমি মনে করি আপনি বলছেন যে আপনি on=key_or_keysসঠিক টেবিলের সারি সন্ধান করার পদ্ধতিটি পরিবর্তন করতে ব্যবহার করতে পারেন । তবে বাস্তবে তা হয় না। onযুক্তি উপর নজর রাখাকে পরিবর্তন বাম সারণী ( df1কলাম (গুলি) তে সূচি থেকে)। তবে এই যুক্তি দিয়েও ডান টেবিলটি df2এর সূচকের সাথে মিলে যাবে। (উপরের শেষ উদাহরণটি দেখুন))
ম্যাথিয়া ফ্রিপ

পান্ডাদের এই পরিস্থিতিগুলি মোকাবিলা করার জন্য বেশ কয়েকটি পদ্ধতি রয়েছে যার মধ্যে মার্জ, যোগ, সংযোজন, সংমিশ্রণ, সংমিশ্রণ, সম্মিলন_প্রথম। আপনার পরিস্থিতির জন্য
কোনটি

13

আমি বিশ্বাস করি যে join()এটি কেবল একটি সুবিধার পদ্ধতি। df1.merge(df2)পরিবর্তে চেষ্টা করুন, যা আপনাকে নির্দিষ্ট করার অনুমতি দেয় left_onএবং right_on:

In [30]: left.merge(right, left_on="key1", right_on="key2")
Out[30]: 
  key1  lval key2  rval
0  foo     1  foo     4
1  bar     2  bar     5

11

এই ডকুমেন্টেশন থেকে

পান্ডাস একক ফাংশন সরবরাহ করে, মার্জ করে, সমস্ত স্ট্যান্ডার্ড ডাটাবেসের ডেটাফ্রেম অবজেক্টের মধ্যে ক্রিয়াকলাপে যোগদানের জন্য:

merge(left, right, how='inner', on=None, left_on=None, right_on=None,
      left_index=False, right_index=False, sort=True,
      suffixes=('_x', '_y'), copy=True, indicator=False)

এবং :

DataFrame.joinদুটি সম্ভাব্য আলাদা আলাদা-ইনডেক্সড ডাটাফ্রেমগুলির কলামগুলি একক ফলাফল ডেটা ফ্রেমের সাথে সংযুক্ত করার জন্য একটি সুবিধাজনক পদ্ধতি। এটি একটি খুব প্রাথমিক উদাহরণ: এখানে ডেটা সারিবদ্ধকরণ সূচীতে রয়েছে (সারি লেবেলগুলি)। এই একই আচরণটি মার্জ প্লাস এবং সূচকগুলি ব্যবহারের নির্দেশ দেওয়ার জন্য অতিরিক্ত যুক্তি ব্যবহার করে অর্জন করা যেতে পারে:

result = pd.merge(left, right, left_index=True, right_index=True,
how='outer')

8

পার্থক্যের মধ্যে mergeএকটি হ'ল নতুন সূচক তৈরি করা joinহচ্ছে এবং বাম দিকের সূচকটি রাখা হচ্ছে। আপনি যদি ভুলভাবে ধরে নেন যে আপনার সূচকটি পরিবর্তিত হয়নি তবে এটি আপনার পরবর্তী পরিবর্তনগুলিতে একটি বড় পরিণতি হতে পারে merge

উদাহরণ স্বরূপ:

import pandas as pd

df1 = pd.DataFrame({'org_index': [101, 102, 103, 104],
                    'date': [201801, 201801, 201802, 201802],
                    'val': [1, 2, 3, 4]}, index=[101, 102, 103, 104])
df1

       date  org_index  val
101  201801        101    1
102  201801        102    2
103  201802        103    3
104  201802        104    4

-

df2 = pd.DataFrame({'date': [201801, 201802], 'dateval': ['A', 'B']}).set_index('date')
df2

       dateval
date          
201801       A
201802       B

-

df1.merge(df2, on='date')

     date  org_index  val dateval
0  201801        101    1       A
1  201801        102    2       A
2  201802        103    3       B
3  201802        104    4       B

-

df1.join(df2, on='date')
       date  org_index  val dateval
101  201801        101    1       A
102  201801        102    2       A
103  201802        103    3       B
104  201802        104    4       B

ঐটা ঠিক. যদি আমরা সূচি ব্যতীত কলামগুলিতে দুটি ডেটা ফ্রেম একত্রীভূত করি তবে আমরা একটি নতুন সূচক পাব তবে আমরা উভয় ডেটা ফ্রেমের সূচকে একীভূত হলে আমরা একই সূচক সহ একটি ডেটা ফ্রেম পাব। সুতরাং, মার্জ হওয়ার পরে একই সূচকটি পেতে আমরা উভয় ডেটা ফ্রেমের জন্য কলামগুলি আমাদের সূচক (যার উপর আমরা সংহত করতে চাই) করতে পারি এবং তারপরে নতুন তৈরি সূচকগুলিতে ডেটা ফ্রেমগুলি মার্জ করতে পারি।
হাসান নাজিব

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

4
  • যোগদান করুন: ডিফল্ট সূচক (যদি কোনও একই কলামের নাম হয় তবে এটি ডিফল্ট মোডে ত্রুটি ছুঁড়ে দেবে কারণ আপনি lsuffix বা rsuffix সংজ্ঞায়িত করেননি)
df_1.join(df_2)
  • মার্জ করুন: ডিফল্ট একই কলামের নাম (একই কলামের নাম না থাকলে এটি ডিফল্ট মোডে ত্রুটি নিক্ষেপ করবে)
df_1.merge(df_2)
  • on উভয় ক্ষেত্রেই প্যারামিটারের আলাদা অর্থ রয়েছে
df_1.merge(df_2, on='column_1')

df_1.join(df_2, on='column_1') // It will throw error
df_1.join(df_2.set_index('column_1'), on='column_1')

2

এটিকে এসকিউএল-তে আনুষাঙ্গিকভাবে রাখার জন্য "পান্ডাস মার্জটি আভ্যন্তরীণ / অভ্যন্তরীণ জোড়ায় এবং পান্ডাস যোগে প্রাকৃতিক যোগদান"। সুতরাং আপনি যখন পান্ডায় একত্রীকরণ ব্যবহার করবেন তখন আপনি কোন ধরণের স্ক্লিশ যোগে ব্যবহার করতে চান তা নির্দিষ্ট করতে চাইবেন যখন আপনি পান্ডাস যোগদান করবেন তখন আপনি অবশ্যই এটির সাথে মিলিত হওয়ার জন্য একটি মিলের কলাম লেবেল রাখতে চান

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