পান্ডে মার্জ () এবং কনক্যাট () এর মধ্যে পার্থক্য (গুলি)


89

মধ্যে অপরিহার্য পার্থক্য (গুলি) কি pd.DataFrame.merge()এবং pd.concat()?

এখনও অবধি, এটি আমি খুঁজে পেয়েছি, অনুগ্রহ করে আমার বোঝাপড়াটি কীভাবে সম্পূর্ণ এবং নির্ভুল তা মন্তব্য করুন:

  • .merge()কেবল কলামগুলি (প্লাস সারি-সূচকগুলি) ব্যবহার করতে পারে এবং এটি ডেটাবেস-শৈলীর ক্রিয়াকলাপের জন্য শব্দার্থগতভাবে উপযুক্ত। .concat()অক্ষগুলি দিয়ে ব্যবহার করা যেতে পারে, কেবল সূচকগুলি ব্যবহার করে এবং একটি শ্রেণিবিন্যাস সূচক যুক্ত করার বিকল্প দেয়।

  • ঘটনাচক্রে, এটি নিম্নলিখিত অপ্রয়োজনীয়তার জন্য অনুমতি দেয়: উভয় সারি সূচকগুলি ব্যবহার করে দুটি ডেটাফ্রেম একত্রিত করতে পারে।

  • pd.DataFrame.join() কেবলমাত্র ব্যবহারের ক্ষেত্রে সাবসেটের জন্য একটি শর্টহ্যান্ড দেয় .merge()

(পান্ডস ডেটা বিশ্লেষণে ব্যবহারের বিস্তৃত ক্ষেত্রগুলিকে সম্বোধন করার ক্ষেত্রে দুর্দান্ত a কোনও নির্দিষ্ট কাজ সম্পাদন করার সর্বোত্তম উপায় কী তা নির্ধারণ করার জন্য ডকুমেন্টেশন অন্বেষণ করা কিছুটা সাহসী হতে পারে))


4
এছাড়াও, সম্পর্কিত: stackoverflow.com/a/37891437/1972495 চারপাশে .merge()এবং .join()
উইন্ডচাইমস

4
একত্রীকরণ, যোগদান এবং সমঝোতায়, আমি এই উত্তরটি খুব স্পষ্টভাবে খুঁজে পেয়েছি যে তারা কীভাবে একই জিনিস ব্যবহার করতে ব্যবহার করা যায় (তারা একই কার্যকারিতার কেবল বিকল্প ইন্টারফেস বলে মনে হয়)। আপনার প্রশ্নের ধন্যবাদ (এবং আপনি যে মন্তব্যে উত্তরটি সংযুক্ত করেছেন) অবশেষে আমি জানি কীভাবে মার্জ এবং যোগদান সম্পর্কিত understand কনক্যাট কোনও আলাদা বাস্তবায়ন ব্যবহার করে বা না ব্যবহার করে তা এখনও আমার কাছে অস্পষ্ট (আমার ধারণা আমি উত্স কোডটি দেখতে হবে ...)
পিট্রোপপিটার

উত্তর:


79

খুব উচ্চ স্তরের পার্থক্যটি হ'ল merge()সাধারণ কলামগুলির মানগুলির ভিত্তিতে দুটি (বা আরও) ডেটাফ্রেম একত্রিত করতে ব্যবহৃত হয় (সূচকগুলিও ব্যবহার করা যেতে পারে, left_index=Trueএবং / অথবা right_index=True), এবং concat()একটি (বা আরও) ডেটা ফ্রেম যুক্ত করতে ব্যবহৃত হয় অপরের নীচে (বা পাশের ধারে, axisবিকল্পটি 0 বা 1 তে সেট করা আছে তার উপর নির্ভর করে )।

join()সূচকের ভিত্তিতে 2 ডেটাফ্রেমগুলি মার্জ করার জন্য ব্যবহৃত হয়; পরিবর্তে merge()বিকল্প left_index=Trueব্যবহার করে আমরা ব্যবহার করতে পারেন join()

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

df1 = pd.DataFrame({'Key': ['b', 'b', 'a', 'c', 'a', 'a', 'b'], 'data1': range(7)})

df1:
   Key  data1
0   b   0
1   b   1
2   a   2
3   c   3
4   a   4
5   a   5
6   b   6

df2 = pd.DataFrame({'Key': ['a', 'b', 'd'], 'data2': range(3)})

df2:
    Key data2
0   a   0
1   b   1
2   d   2

#Merge
# The 2 dataframes are merged on the basis of values in column "Key" as it is 
# a common column in 2 dataframes

pd.merge(df1, df2)

   Key data1 data2
0   b    0    1
1   b    1    1
2   b    6    1
3   a    2    0
4   a    4    0
5   a    5    0

#Concat
# df2 dataframe is appended at the bottom of df1 

pd.concat([df1, df2])

   Key data1 data2
0   b   0     NaN
1   b   1     NaN
2   a   2     NaN
3   c   3     NaN
4   a   4     NaN
5   a   5     NaN
6   b   6     NaN
0   a   Nan   0
1   b   Nan   1
2   d   Nan   2

সুতরাং, এর অর্থ এই যে যুক্তি howমধ্যে mergeকাজ করে এবং যা তাতে করে চেয়ে সম্পূর্ণ ভিন্ন অর্থ concat?
হেমন্ত বাকায়া

11

pd.concatএটি Iterableতার যুক্তি হিসাবে গ্রহণ করে । সুতরাং এটি DataFrameসরাসরি তার যুক্তি হিসাবে গ্রহণ করতে পারে না । এছাড়াও Dimensionএর গুলি DataFrameঅক্ষ বরাবর সুসংগত হওয়া আবশ্যক যখন concatenating।

pd.mergeএটি DataFrameতার তর্ক হিসাবে গ্রহণ করতে পারে এবং DataFrameএকই কলাম বা সূচকের সাথে দুটি গুলি একত্রিত করতে ব্যবহৃত হয় , যা এটি করা যায় না pd.concatকারণ এটি ডেটা ফ্রেমের পুনরাবৃত্তি কলামটি দেখায়।

যেখানে যোগদান দুটি DataFrameবিভিন্ন সূচকে দুটিতে যোগদান করতে ব্যবহৃত হতে পারে ।


7
আমি এই উত্তরটি পছন্দ করি কারণ এতে উল্লেখ করা হয় যে সংক্ষিপ্তকরণের সময় মাত্রাগুলি মেলা উচিত। concatপ্রতিটিের উপরে / পাশের উপরে বেশ কয়েকটি ডেটাফ্রেমগুলি আঠালো করা ছাড়া আর কিছুই নয়। এটি এই বিষয়বস্তুতে সচেতন নয় যে এটি কেবল একই কলামটি দু'বার প্রদর্শন করবে। যেখানে mergeআসলে হবে একত্রীকরণ কলাম তারা একই হয়।

4
আমি মনে করি এটি সত্য নয়। এমনকি উপরের উত্তরটি (@ অভিষেক সাওয়ান্ত দ্বারা) concatযেখানে মাত্রা মেলে না তার একটি উদাহরণ দেয় ।
michcio1234

7

আমি বর্তমানে মধ্যে অপরিহার্য পার্থক্য (গুলি) বুঝতে চেষ্টা করছি pd.DataFrame.merge()এবং pd.concat()

দুর্দান্ত প্রশ্ন। প্রধান পার্থক্যটি:

pd.concat উভয় অক্ষ উপর কাজ করে।

অন্য পার্থক্য, হয় pd.concat হয়েছে ভেতরের ডিফল্ট এবং বাইরের শুধুমাত্র যোগদান করে, যখন pd.DataFrame.merge()হয়েছে বাম , ডান , বাইরের , ভিতরের ডিফল্ট যোগদান করে।

তৃতীয় উল্লেখযোগ্য অন্যান্য পার্থক্য হ'ল: pd.DataFrame.merge()একই নামের সাথে কলামগুলি মার্জ করার সময় কলাম প্রত্যয় সেট করার বিকল্প রয়েছে, যদিও এর জন্য pd.concatএটি সম্ভব নয়।


সঙ্গে pd.concatডিফল্ট ভাবে আপনার একাধিক dataframes (সারি গাদা করতে সক্ষম axis=0) এবং যখন আপনি সেট axis=1তারপর আপনি অনুকরণ pd.DataFrame.merge()ফাংশন।

এর কয়েকটি দরকারী উদাহরণ pd.concat:

df2=pd.concat([df]*2, ignore_index=True) #double the rows of a dataframe

df2=pd.concat([df, df.iloc[[0]]]) # add first row to the end

df3=pd.concat([df1,df2], join='inner', ignore_index=True) # concat two df's

6

উচ্চ স্তরে:

  • .concat()খালি DataFrameউল্লম্বভাবে একসাথে একসাথে স্ট্যাক করে , বা সূচীতে সারিবদ্ধ হওয়ার পরে অনুভূমিকভাবে সেলাইগুলি
  • .merge()প্রথমে দুটি DataFrame'নির্বাচিত সাধারণ কলাম (গুলি) বা সূচি সারিবদ্ধ করে এবং তারপরে প্রতিটি স্তরের সারিবদ্ধ সারিবদ্ধ থেকে অবশিষ্ট কলামগুলি তুলুন DataFrame

আরও নির্দিষ্টভাবে .concat():

  • একটি শীর্ষ স্তরের পান্ডাস ফাংশন
  • DataFrame উল্লম্ব বা অনুভূমিকভাবে দুটি বা আরও বেশি পান্ডার সংমিশ্রণ ঘটে
  • অনুভূমিকভাবে একত্রিত হওয়ার সময় কেবল সূচকগুলিতে প্রান্তিক হয়
  • ত্রুটিগুলি যখন কোনও DataFrameসদৃশ সূচক থাকে তখন।
  • অভ্যন্তরীণ যোগদানের বিকল্পের সাথে বাইরের যোগদানের ডিফল্ট

এবং .merge() :

  • উভয়ই একটি শীর্ষ-স্তরের পান্ডাস ফাংশন এবং এ হিসাবে উপস্থিত রয়েছে DataFrame পদ্ধতি (প্যান্ডাস 1.0 হিসাবে)
  • একসাথে ঠিক দুটি DataFrameঅনুভূমিকভাবে
  • কলিংয়ের DataFrameকলাম (গুলি) বা অন্যটির সাথে সূচী সারিবদ্ধ করেDataFrame কলাম (গুলি) বা সূচকের সাথে সূচী ধরে রাখে
  • যোগদানকারী কলাম বা সূচীতে সদৃশ মানগুলি পরিচালনা করেকার্টেসিয়ান পণ্য সম্পাদন করে
  • বাম, বাহ্যিক এবং ডান দিকের বিকল্পগুলির সাথে অভ্যন্তরীণ যোগদানের ডিফল্ট

নোট করুন যে সম্পাদন করার সময় pd.merge(left, right), leftযোগদানকারী কলামগুলি বা সূচী থেকে দুটি সারি একই মানযুক্ত থাকে, প্রতিটি সারি rightএর সাথে সম্পর্কিত সারি (গুলি) এর সাথে একত্রিত হবে যার ফলস্বরূপ কার্টেসিয়ান পণ্য দেখাবে। অন্যদিকে, যদি .concat()কলামগুলি একত্রিত করতে ব্যবহৃত হয় , তবে আমাদের নিশ্চিত করতে হবে যে দুটির মধ্যে কোনও সদৃশ সূচক উপস্থিত নেইDataFrame

ব্যবহারিকভাবে বলতে:

  • .concat()সমজাতীয় একত্রিত করার সময় প্রথমে বিবেচনা করুন DataFrame, যখন .merge()পরিপূরক সংমিশ্রণের ক্ষেত্রে প্রথমে বিবেচনা করুন DataFrame
  • যদি উল্লম্বভাবে একত্রীকরণের প্রয়োজন হয় তবে সাথে যান .concat()। কলামগুলির মাধ্যমে অনুভূমিকভাবে একত্রীকরণের প্রয়োজন হলে সাথে যান .merge(), যা কলামগুলিতে ডিফল্টরূপে মিলিত হয়।

তথ্যসূত্র: পান্ডাস 1.x কুকবুক


2

মার্জ এবং কনকটের মধ্যে প্রধান পার্থক্য হ'ল মার্জটি আপনাকে সারণীর আরও কাঠামোগত "যোগদান" করতে দেয় যেখানে কনক্যাট ব্যবহার আরও প্রশস্ত এবং কম কাঠামোগত হয়।

একত্রিত করা

ডকুমেন্টেশন উল্লেখ , ডান একটি প্রয়োজনীয় আর্গুমেন্ট হিসাবে pd.DataFrame.mergeগ্রহণ করে , আপনি কিছু প্রাক সংজ্ঞায়িত কাঠামোগত যোগদান ক্রিয়াকলাপ অনুযায়ী বাম টেবিল এবং ডান টেবিল যোগদান হিসাবে এটি ভাবতে পারেন। সঠিক পরামিতি জন্য সংজ্ঞা নোট করুন ।

প্রয়োজনীয় পরামিতি

  • ডান : ডেটাফ্রেম বা নামযুক্ত সিরিজ

.চ্ছিক পরামিতি

  • কিভাবে : {'বাম', 'ডান', 'বহিরাগত', 'অভ্যন্তরীণ'} ডিফল্ট 'অভ্যন্তরীণ'
  • চালু : লেবেল বা তালিকা
  • রেখে : লেবেল বা তালিকা, বা অ্যারের মতো
  • ঠিক : লেবেল বা তালিকা, বা অ্যারের মতো
  • বাম_ইন্ডেক্স : , ডিফল্ট মিথ্যা
  • ডান_ইন্ডেক্স : , ডিফল্ট মিথ্যা
  • সাজান : বুল, ডিফল্ট মিথ্যা
  • প্রত্যয় : (টিআরআর, টিআরআর) এর টিপল, ডিফল্ট ('_x', '_y')
  • অনুলিপি : বুল, ডিফল্ট সত্য
  • সূচক : bool বা str, ডিফল্ট মিথ্যা
  • বৈধতা দিন : str, alচ্ছিক

গুরুত্বপূর্ণ: pd.DataFrame.merge একটি pd.DataFrameবা নামযুক্ত pd.Seriesবস্তু হওয়ার অধিকার প্রয়োজন ।

আউটপুট

  • রিটার্নস : ডেটাফ্রেম

তদতিরিক্ত, যদি আমরা পান্ডাসে মার্জ অপারেশনের জন্য ডক্ট্রিংটি নীচে নীচে দেখি:

কী বা তাদের সারি সূচক হিসাবে কলামগুলি ব্যবহার করে দুটি ডেটাফ্রেম বা সিরিজ অবজেক্টের মধ্যে একটি ডেটাবেস (এসকিউএল) একত্রিত অপারেশন সম্পাদন করুন

কনক্যাট

পড়ুন ডকুমেন্টেশন এর pd.concatযে প্যারামিটারের কোন নামে করা হয় না, প্রথম নোট টেবিল data_frame, সিরিজ, ম্যাট্রিক্স , ইত্যাদি, কিন্তু objs পরিবর্তে। এটি হল, আপনি অনেকগুলি "ডেটা পাত্রে" পাস করতে পারেন, যা এই হিসাবে সংজ্ঞায়িত হয়েছে:

Iterable[FrameOrSeriesUnion], Mapping[Optional[Hashable], FrameOrSeriesUnion]

প্রয়োজনীয় পরামিতি

  • আপত্তি : সিরিজ বা ডেটা ফ্রেম অবজেক্টের ক্রম বা ম্যাপিং

.চ্ছিক পরামিতি

  • অক্ষ : {0 / 'সূচক', 1 / 'কলাম'}, ডিফল্ট 0
  • যোগদান : {'অভ্যন্তরীণ', 'বাহ্যিক'}, ডিফল্ট 'বাহ্যিক'
  • উপেক্ষা_আইডেক্স : বুল , ডিফল্ট মিথ্যা
  • কীগুলি : ক্রম, ডিফল্ট কিছুই নয়
  • স্তরসমূহ : ক্রমগুলির তালিকা, ডিফল্ট কোনও নয়
  • নাম : তালিকা, কোনও ডিফল্ট নয়
  • যাচাই_আনত্যাগ : বুল , ডিফল্ট মিথ্যা
  • সাজান : বুল, ডিফল্ট মিথ্যা
  • অনুলিপি : বুল, ডিফল্ট সত্য

আউটপুট

  • রিটার্নস : অবজেক্ট, অবজেক্টের ধরণ

উদাহরণ

কোড

import pandas as pd

v1 = pd.Series([1, 5, 9, 13])
v2 = pd.Series([10, 100, 1000, 10000])
v3 = pd.Series([0, 1, 2, 3])

df_left = pd.DataFrame({
    "v1": v1,
    "v2": v2,
    "v3": v3
    })
df_right = pd.DataFrame({
    "v4": [5, 5, 5, 5],
    "v5": [3, 2, 1, 0]
    })


df_concat = pd.concat([v1, v2, v3])

# Performing operations on default

merge_result = df_left.merge(df_right, left_index=True, right_index=True)
concat_result = pd.concat([df_left, df_right], sort=False)
print(merge_result)
print('='*20)
print(concat_result)

কোড আউটপুট

   v1     v2  v3  v4  v5
0   1     10   0   5   3
1   5    100   1   5   2
2   9   1000   2   5   1
3  13  10000   3   5   0
====================
     v1       v2   v3   v4   v5
0   1.0     10.0  0.0  NaN  NaN
1   5.0    100.0  1.0  NaN  NaN
2   9.0   1000.0  2.0  NaN  NaN
3  13.0  10000.0  3.0  NaN  NaN
0   NaN      NaN  NaN  5.0  3.0
1   NaN      NaN  NaN  5.0  2.0
2   NaN      NaN  NaN  5.0  1.0

অক্ষের প্যারামিটার পরিবর্তন করে আপনি কনক্যাটের সাথে প্রথম আউটপুট (মার্জ) অর্জন করতে পারেন

concat_result = pd.concat([df_left, df_right], sort=False, axis=1)

নিম্নলিখিত আচরণ পর্যবেক্ষণ করুন,

concat_result = pd.concat([df_left, df_right, df_left, df_right], sort=False)

ফলাফল;

     v1       v2   v3   v4   v5
0   1.0     10.0  0.0  NaN  NaN
1   5.0    100.0  1.0  NaN  NaN
2   9.0   1000.0  2.0  NaN  NaN
3  13.0  10000.0  3.0  NaN  NaN
0   NaN      NaN  NaN  5.0  3.0
1   NaN      NaN  NaN  5.0  2.0
2   NaN      NaN  NaN  5.0  1.0
3   NaN      NaN  NaN  5.0  0.0
0   1.0     10.0  0.0  NaN  NaN
1   5.0    100.0  1.0  NaN  NaN
2   9.0   1000.0  2.0  NaN  NaN
3  13.0  10000.0  3.0  NaN  NaN
0   NaN      NaN  NaN  5.0  3.0
1   NaN      NaN  NaN  5.0  2.0
2   NaN      NaN  NaN  5.0  1.0
3   NaN      NaN  NaN  5.0  0.0

, যা আপনি মার্জ করে একই ধরণের ক্রিয়াকলাপ সম্পাদন করতে পারবেন না, কারণ এটি কেবলমাত্র একটি একক ডেটাফ্রেম বা নামধারী সিরিজের অনুমতি দেয়।

merge_result = df_left.merge([df_right, df_left, df_right], left_index=True, right_index=True)

ফলাফল;

TypeError: Can only merge Series or DataFrame objects, a <class 'list'> was passed

উপসংহার

আপনার ইতিমধ্যে লক্ষ্য থাকতে পারে যে ইনপুট এবং আউটপুটগুলি "মার্জ" এবং "কনক্যাট" এর মধ্যে পৃথক হতে পারে।

আমি প্রথমদিকে যেমন উল্লেখ করেছি, খুব প্রথম (প্রধান) পার্থক্যটি হ'ল "মার্জ" একটি নিয়ন্ত্রিত সংস্থাগুলির সেট এবং পরামিতিগুলির সেটের সাথে আরও কাঠামোগত সংযুক্তি সম্পাদন করে যেখানে "কনক্যাট" একটি বিস্তৃত সেটের সাথে কম কঠোর / বিস্তৃত যোগ দেয় বস্তু এবং পরামিতি।

সব মিলিয়ে, মার্জগুলি পরিবর্তন / (ইনপুট) এর প্রতি কম সহনশীল এবং "কনক্যাট" আলগা / পরিবর্তনগুলির প্রতি কম সংবেদনশীল / (ইনপুট)। আপনি "কনক্যাট" ব্যবহার করে "মার্জ" অর্জন করতে পারেন, তবে বিপরীতটি সবসময় সত্য হয় না।

"মার্জ" অপারেশনটি ডেটা ফ্রেম কলামগুলি (বা pd.Seriesবস্তুর নাম ) বা সারি সূচকগুলি ব্যবহার করে এবং যেহেতু এটি কেবলমাত্র সত্তাগুলি ব্যবহার করে এটি ডেটা ফ্রেম বা সিরিজের অনুভূমিক একত্রিত করে এবং ফলস্বরূপ উল্লম্ব ক্রিয়াকলাপ প্রয়োগ করে না।

যদি আপনি আরও দেখতে চান তবে আপনি উত্স কোডটিতে কিছুটা গভীর ডুব দিতে পারেন;


0

কেবল কনক্যাট ফাংশনে অক্ষ প্যারামিটার থাকে। মার্জটি ভাগ করা কলামগুলিতে মানের উপর ভিত্তি করে ডেটা ফ্রেমগুলি পাশাপাশি-একত্রিত করতে ব্যবহৃত হয় যাতে অক্ষ পরামিতিগুলির প্রয়োজন হয় না।


-2

ডিফল্টরূপে:
যোগদানের একটি কলাম ভিত্তিক বাম যোগদান
pd.merge একটি কলাম ভিত্তিক ভেতরের যোগদান
pd.concat একটি সারিতে ভিত্তিক বাইরের হয় যোগদানের

pd.concat:
গ্রহণযোগ্য আর্গুমেন্ট নেয়। সুতরাং, এটি সরাসরি ডেটা ফ্রেম নিতে পারে না (ব্যবহার [df, df2])
ডাটাফ্রেমের মাত্রা অক্ষের সাথে মিলতে হবে

যোগদান করুন এবং পিডি.সমার:
ডেটাফ্রেম আর্গুমেন্ট নিতে পারে

নীচের কোড কেন একই কাজ করে তা বোঝার জন্য ছবি দেখতে ক্লিক করুন

df1.join(df2)
pd.merge(df1, df2, left_index=True, right_index=True)
pd.concat([df1, df2], axis=1)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.