এই পোস্টটির পাঠকরা এসকিউএল-স্বাদযুক্ত পান্ডার সাথে মার্জ করা, এটি কীভাবে ব্যবহার করবেন এবং কখন এটি ব্যবহার করবেন না তার প্রাইমর দেওয়া।
বিশেষত, এই পোস্টটি যা যা করবে তা এখানে:
এই পোস্টে যা হবে না:
- পারফরম্যান্স-সম্পর্কিত আলোচনা এবং সময় (এখন জন্য)। বেশিরভাগ ক্ষেত্রেই উপযুক্ত যেখানে ভাল বিকল্পের উল্লেখযোগ্য উল্লেখযোগ্য।
- প্রত্যয়গুলি পরিচালনা করা, অতিরিক্ত কলামগুলি মুছে ফেলা, আউটপুটগুলির নাম পরিবর্তনকরণ এবং অন্যান্য নির্দিষ্ট ব্যবহারের ক্ষেত্রে। অন্যান্য (পড়ুন: আরও ভাল) পোস্টগুলি যে এটির সাথে ডিল করে, তাই এটি নির্ধারণ করুন!
দ্রষ্টব্য
সুনির্দিষ্ট উদাহরণগুলি অন্য বৈশিষ্ট্যগুলি প্রদর্শন না করে বিভিন্ন বৈশিষ্ট্য প্রদর্শনের সময় INNER যোগদানের ক্রিয়াকলাপে ডিফল্ট হয়।
তদতিরিক্ত, এখানে সমস্ত ডেটা ফ্রেমগুলি অনুলিপি এবং অনুলিপি করা যায় যাতে আপনি তাদের সাথে খেলতে পারেন। এছাড়াও,
আপনার ক্লিপবোর্ড থেকে কীভাবে ডেটা ফ্রেমগুলি পড়তে হয় সে সম্পর্কে এই পোস্টটি দেখুন ।
সবশেষে, জোইন অপারেশনের সমস্ত ভিজ্যুয়াল উপস্থাপনা গুগল অঙ্কন ব্যবহার করে হাতে আঁকানো হয়েছে। এখান থেকে অনুপ্রেরণা ।
পর্যাপ্ত আলাপ, কীভাবে ব্যবহার করতে হবে তা আমাকে দেখান merge
!
সেটআপ
np.random.seed(0)
left = pd.DataFrame({'key': ['A', 'B', 'C', 'D'], 'value': np.random.randn(4)})
right = pd.DataFrame({'key': ['B', 'D', 'E', 'F'], 'value': np.random.randn(4)})
left
key value
0 A 1.764052
1 B 0.400157
2 C 0.978738
3 D 2.240893
right
key value
0 B 1.867558
1 D -0.977278
2 E 0.950088
3 F -0.151357
সরলতার স্বার্থে, মূল কলামটির একই নাম (আপাতত) রয়েছে।
একটি অন্তর্ভুক্ত যোগদান দ্বারা প্রতিনিধিত্ব করা হয়
এটি দ্রষ্টব্য
, আসন্ন পরিসংখ্যান সহ সকলেই এই সম্মেলনটি অনুসরণ করে:
- নীল সারিগুলি নির্দেশ করে যা মার্জ ফলাফলের মধ্যে উপস্থিত present
- লাল ফলাফলগুলি থেকে বাদ দেওয়া সারিগুলি নির্দেশ করে (যেমন, সরানো)
- সবুজ অনুপস্থিত মানগুলিকে নির্দেশ করে যা ফলাফলের মধ্যে NaN দ্বারা প্রতিস্থাপিত হয়
একটি অন্তর্ভুক্ত merge
যোগদানের জন্য, ডান ডেটাফ্রেম এবং যুক্ত কী (খুব কমপক্ষে) যুক্তি হিসাবে উল্লেখ করে বাম ডাটাফ্রেমে কল করুন।
left.merge(right, on='key')
# Or, if you want to be explicit
# left.merge(right, on='key', how='inner')
key value_x value_y
0 B 0.400157 1.867558
1 D 2.240893 -0.977278
এটি কেবলমাত্র সারিগুলি থেকে ফিরে আসে left
এবং right
যা একটি সাধারণ কী ভাগ করে (উদাহরণস্বরূপ, "বি" এবং "ডি)।
একটি বাম আউটরের যোগদান , বা বাম যোগদান দ্বারা প্রতিনিধিত্ব করা হয়
এটি নির্দিষ্ট করে সম্পাদন করা যেতে পারে how='left'
।
left.merge(right, on='key', how='left')
key value_x value_y
0 A 1.764052 NaN
1 B 0.400157 1.867558
2 C 0.978738 NaN
3 D 2.240893 -0.977278
মনোযোগ সহকারে এখানে এনএএনএস স্থাপন করুন। আপনি যদি নির্দিষ্ট করে থাকেন how='left'
তবে কেবলমাত্র কীগুলি left
ব্যবহার করা হবে এবং এর থেকে অনুপস্থিত ডেটা right
NaN দ্বারা প্রতিস্থাপিত হবে।
এবং তেমনিভাবে, একটি সঠিক আউট জয়েনের জন্য , বা সঠিক যোগদানের জন্য যা ...
... নির্দিষ্ট করুন how='right'
:
left.merge(right, on='key', how='right')
key value_x value_y
0 B 0.400157 1.867558
1 D 2.240893 -0.977278
2 E NaN 0.950088
3 F NaN -0.151357
এখানে, থেকে কীগুলি right
ব্যবহার করা হয়, এবং থেকে হারিয়ে যাওয়া ডেটা left
NaN দ্বারা প্রতিস্থাপন করা হয়।
পরিশেষে, প্রদত্ত ফুল আউটর জয়েনের জন্য
উল্লেখ how='outer'
।
left.merge(right, on='key', how='outer')
key value_x value_y
0 A 1.764052 NaN
1 B 0.400157 1.867558
2 C 0.978738 NaN
3 D 2.240893 -0.977278
4 E NaN 0.950088
5 F NaN -0.151357
এটি উভয় ফ্রেমের কীগুলি ব্যবহার করে এবং দু'এই সারি নিখোঁজ হওয়ার জন্য NaN areোকানো হয়েছে।
ডকুমেন্টেশন এই বিভিন্ন মার্জগুলি সংক্ষিপ্তসার করে:
অন্যান্য যোগদান - বাম-বাদ, ডান-বাদ, এবং সম্পূর্ণ-বাদ দিয়ে / এন্টি যোগদান
আপনার যা দরকার তা যদি বাঁ-অপসারণ যোগদান করে এবং ডান-অপসারণ যোগদান করে দুই ধাপ হবে।
বাম-বাদ দিয়ে যোগ দানের জন্য, হিসাবে উপস্থাপিত
একটি বাম আউটয়ার জয়েন সম্পাদন করে এবং তারপরে left
কেবলমাত্র আসার পরে (বাদ দিয়ে!) সারিগুলি শুরু করে ,
(left.merge(right, on='key', how='left', indicator=True)
.query('_merge == "left_only"')
.drop('_merge', 1))
key value_x value_y
0 A 1.764052 NaN
2 C 0.978738 NaN
কোথায়,
left.merge(right, on='key', how='left', indicator=True)
key value_x value_y _merge
0 A 1.764052 NaN left_only
1 B 0.400157 1.867558 both
2 C 0.978738 NaN left_only
3 D 2.240893 -0.977278 both
এবং তেমনিভাবে, একটি রাইট-ব্যতীত যোগদানের জন্য,
(left.merge(right, on='key', how='right', indicator=True)
.query('_merge == "right_only"')
.drop('_merge', 1))
key value_x value_y
2 E NaN 0.950088
3 F NaN -0.151357
শেষ অবধি, আপনার যদি এমন একীকরণ করতে হয় যা কেবল বাম বা ডান দিক থেকে কীগুলি ধরে রাখে, তবে উভয়ই নয় (আইডাব্লু, একটি আন্ত-যোগে পারফর্ম করছেন ),
আপনি অনুরূপ ফ্যাশন এ এটি করতে পারেন—
(left.merge(right, on='key', how='outer', indicator=True)
.query('_merge != "both"')
.drop('_merge', 1))
key value_x value_y
0 A 1.764052 NaN
2 C 0.978738 NaN
4 E NaN 0.950088
5 F NaN -0.151357
কী কলামগুলির জন্য বিভিন্ন নাম
কী কলামগুলি আলাদা আলাদাভাবে নামকরণ করা হয়েছে - উদাহরণস্বরূপ, left
রয়েছে keyLeft
এবং right
এর keyRight
পরিবর্তে এটি রয়েছে: এর পরিবর্তে key
আপনাকে উল্লেখ করতে হবে left_on
এবং right_on
পরিবর্তে যুক্তি হিসাবে on
:
left2 = left.rename({'key':'keyLeft'}, axis=1)
right2 = right.rename({'key':'keyRight'}, axis=1)
left2
keyLeft value
0 A 1.764052
1 B 0.400157
2 C 0.978738
3 D 2.240893
right2
keyRight value
0 B 1.867558
1 D -0.977278
2 E 0.950088
3 F -0.151357
left2.merge(right2, left_on='keyLeft', right_on='keyRight', how='inner')
keyLeft value_x keyRight value_y
0 B 0.400157 B 1.867558
1 D 2.240893 D -0.977278
আউটপুটে সদৃশ কী কলামটি এড়ানো
keyLeft
কাছ থেকে আসা left
এবং keyRight
থেকে মার্জ করার সময় right
, আপনি যদি কেবল আউটপুটে keyLeft
বা keyRight
উভয় (তবে উভয়ই নয়) চান তবে আপনি সূচকটিকে প্রাথমিক পদক্ষেপ হিসাবে সেট করে শুরু করতে পারেন।
left3 = left2.set_index('keyLeft')
left3.merge(right2, left_index=True, right_on='keyRight')
value_x keyRight value_y
0 0.400157 B 1.867558
1 2.240893 D -0.977278
কমান্ডের ঠিক আগে আউটপুট দিয়ে left2.merge(right2, left_on='keyLeft', right_on='keyRight', how='inner')
এটির বৈসাদৃশ্য করুন (এটি হ'ল আউটপুট ), আপনি লক্ষ্য করবেন না keyLeft
is কোন ফ্রেমের সূচকে কী হিসাবে সেট করা হয়েছে তার ভিত্তিতে কোন কলামটি রাখতে হবে তা আপনি নির্ধারণ করতে পারেন। এটি যখন আউটর জয়েন অপারেশন সম্পাদন করে তখন বলতে পারে।
এর মধ্যে একটি থেকে কেবল একটি একক কলাম মার্জ করা DataFrames
উদাহরণস্বরূপ, বিবেচনা করুন
right3 = right.assign(newcol=np.arange(len(right)))
right3
key value newcol
0 B 1.867558 0
1 D -0.977278 1
2 E 0.950088 2
3 F -0.151357 3
যদি আপনার কেবল "নতুন_ওয়াল" (অন্য কোনও কলাম ছাড়াই) মার্জ করতে হয় তবে আপনি মার্জ করার আগে সাধারণত কলামগুলি সাবসেট করতে পারেন:
left.merge(right3[['key', 'newcol']], on='key')
key value newcol
0 B 0.400157 0
1 D 2.240893 1
আপনি যদি একটি বাম আউটয়ার জয়েন করে থাকেন তবে আরও পারফরম্যান্স সমাধানটিতে অন্তর্ভুক্ত থাকবে map
:
# left['newcol'] = left['key'].map(right3.set_index('key')['newcol']))
left.assign(newcol=left['key'].map(right3.set_index('key')['newcol']))
key value newcol
0 A 1.764052 NaN
1 B 0.400157 0.0
2 C 0.978738 NaN
3 D 2.240893 1.0
যেমনটি উল্লেখ করা হয়েছে, এটি এর সাথে সমান, তবে এর চেয়ে দ্রুত
left.merge(right3[['key', 'newcol']], on='key', how='left')
key value newcol
0 A 1.764052 NaN
1 B 0.400157 0.0
2 C 0.978738 NaN
3 D 2.240893 1.0
একাধিক কলামে মার্জ করা হচ্ছে
একাধিক কলাম এ যোগ দিতে, জন্য একটি তালিকা নির্দিষ্ট on
(অথবা left_on
এবং right_on
উপযুক্ত হিসাবে)।
left.merge(right, on=['key1', 'key2'] ...)
অথবা, ইভেন্টে নামগুলি আলাদা,
left.merge(right, left_on=['lkey1', 'lkey2'], right_on=['rkey1', 'rkey2'])
অন্যান্য দরকারী merge*
অপারেশন এবং ফাংশন
এই বিভাগটি কেবলমাত্র খুব মৌলিক বিষয়গুলি কভার করে এবং এটি কেবল আপনার ক্ষুধা ঘটাতে ডিজাইন করা হয়েছে। আরো উদাহরণ এবং মামলা জন্য, দেখুন উপর ডকুমেন্টেশন merge
, join
এবংconcat
সেইসাথে ফাংশন চশমা লিঙ্ক হিসাবে।
সূচক-ভিত্তিক * -জয়াইন (+ সূচক-কলাম merge
)
সেটআপ
np.random.seed([3, 14])
left = pd.DataFrame({'value': np.random.randn(4)}, index=['A', 'B', 'C', 'D'])
right = pd.DataFrame({'value': np.random.randn(4)}, index=['B', 'D', 'E', 'F'])
left.index.name = right.index.name = 'idxkey'
left
value
idxkey
A -0.602923
B -0.402655
C 0.302329
D -0.524349
right
value
idxkey
B 0.543843
D 0.013135
E -0.326498
F 1.385076
সাধারণত, সূচীতে একীভূত হওয়ার বিষয়টি দেখতে পাবেন:
left.merge(right, left_index=True, right_index=True)
value_x value_y
idxkey
B -0.402655 0.543843
D -0.524349 0.013135
সূচকের নামগুলির জন্য সমর্থন
যদি আপনার সূচকের নাম দেওয়া হয়, তবে v0.23 ব্যবহারকারীরা স্তরের নামও on
(বা left_on
এবং right_on
প্রয়োজনীয় হিসাবে) নির্দিষ্ট করতে পারবেন ।
left.merge(right, on='idxkey')
value_x value_y
idxkey
B -0.402655 0.543843
D -0.524349 0.013135
অন্যের কলাম (গুলি) এর সূচকে মার্জ করা
একের সূচক এবং অন্যটির কলামটি, একত্রিত করার জন্য এটি ব্যবহার করা সম্ভব (এবং বেশ সহজ)। উদাহরণ স্বরূপ,
left.merge(right, left_on='key1', right_index=True)
বা বিপরীত ( right_on=...
এবং left_index=True
)।
right2 = right.reset_index().rename({'idxkey' : 'colkey'}, axis=1)
right2
colkey value
0 B 0.543843
1 D 0.013135
2 E -0.326498
3 F 1.385076
left.merge(right2, left_index=True, right_on='colkey')
value_x colkey value_y
0 -0.402655 B 0.543843
1 -0.524349 D 0.013135
এই বিশেষ ক্ষেত্রে, সূচকটির left
নামকরণ করা হয়েছে, সুতরাং আপনি সূচির নামটিও এর সাথে ব্যবহার করতে পারেন left_on
:
left.merge(right2, left_on='idxkey', right_on='colkey')
value_x colkey value_y
0 -0.402655 B 0.543843
1 -0.524349 D 0.013135
DataFrame.join
এগুলি ছাড়াও, আরও একটি সংক্ষিপ্ত বিকল্প রয়েছে। DataFrame.join
সূচকগুলিতে কোন ডিফল্টগুলিতে যোগদান হয় আপনি তা ব্যবহার করতে পারেন । DataFrame.join
একটি ডিফল্ট হিসাবে একটি বাম আউটয়ার যোগদান করে, তাই how='inner'
এখানে প্রয়োজনীয়।
left.join(right, how='inner', lsuffix='_x', rsuffix='_y')
value_x value_y
idxkey
B -0.402655 0.543843
D -0.524349 0.013135
নোট করুন যেহেতু আমার পক্ষে যুক্তিগুলি lsuffix
এবং rsuffix
যুক্তিগুলি নির্দিষ্ট করার দরকার ছিল যেহেতু join
অন্যথায় ত্রুটি ঘটবে:
left.join(right)
ValueError: columns overlap but no suffix specified: Index(['value'], dtype='object')
যেহেতু কলামের নাম একই। তাদের আলাদা আলাদা নাম দেওয়া থাকলে সমস্যা হবে না।
left.rename(columns={'value':'leftvalue'}).join(right, how='inner')
leftvalue value
idxkey
B -0.402655 0.543843
D -0.524349 0.013135
pd.concat
শেষ অবধি, সূচক-ভিত্তিক যোগদানের বিকল্প হিসাবে আপনি ব্যবহার করতে পারেন pd.concat
:
pd.concat([left, right], axis=1, sort=False, join='inner')
value value
idxkey
B -0.402655 0.543843
D -0.524349 0.013135
ফেরত join='inner'
আপনি একটি সম্পূর্ণ বহিঃস্থ সংযোগ (ডিফল্ট) প্রয়োজন হলে:
pd.concat([left, right], axis=1, sort=False)
value value
A -0.602923 NaN
B -0.402655 0.543843
C 0.302329 NaN
D -0.524349 0.013135
E NaN -0.326498
F NaN 1.385076
আরও তথ্যের জন্য, এই pd.concat
পিওএসস্কয়ার্ড দ্বারা পোস্ট করা পোস্টটি দেখুন ।
সরলীকরণ: merge
একাধিক ডেটা ফ্রেমগুলি অন্তর্ভুক্ত করা হচ্ছে
প্রায়শই, একাধিক ডেটা ফ্রেম একসাথে একত্রীকরণ করতে গেলে পরিস্থিতি দেখা দেয়। নিঃসন্দেহে, merge
কলগুলি শৃঙ্খলাবদ্ধ করে এটি করা যেতে পারে :
df1.merge(df2, ...).merge(df3, ...)
তবে এটি অনেক ডেটা ফ্রেমের জন্য দ্রুত হাতছাড়া হয়ে যায়। তদ্ব্যতীত, অজানা সংখ্যক ডেটা ফ্রেমগুলির জন্য সাধারণকরণ করা প্রয়োজন হতে পারে।
আমি এখানে অনন্য কীগুলিতে মাল্টি-ওয়ে যোগদানের জন্য এবং অ-অনন্য কীগুলিতে pd.concat
মাল্টি-ওয়ে যোগদানের জন্য পরিচয় করিয়ে দিচ্ছি । প্রথমে সেটআপ।DataFrame.join
# Setup.
np.random.seed(0)
A = pd.DataFrame({'key': ['A', 'B', 'C', 'D'], 'valueA': np.random.randn(4)})
B = pd.DataFrame({'key': ['B', 'D', 'E', 'F'], 'valueB': np.random.randn(4)})
C = pd.DataFrame({'key': ['D', 'E', 'J', 'C'], 'valueC': np.ones(4)})
dfs = [A, B, C]
# Note, the "key" column values are unique, so the index is unique.
A2 = A.set_index('key')
B2 = B.set_index('key')
C2 = C.set_index('key')
dfs2 = [A2, B2, C2]
একচেটিয়া কীগুলিতে (বা সূচি) মাল্টিওয়ে একত্রীকরণ
যদি আপনার কীগুলি (এখানে, কীটি কলাম বা সূচি হতে পারে) অনন্য হয়, তবে আপনি ব্যবহার করতে পারেন pd.concat
। নোট করুন যে pd.concat
সূচীতে ডেটাফ্রেমে যোগ দেয় ।
# merge on `key` column, you'll need to set the index before concatenating
pd.concat([
df.set_index('key') for df in dfs], axis=1, join='inner'
).reset_index()
key valueA valueB valueC
0 D 2.240893 -0.977278 1.0
# merge on `key` index
pd.concat(dfs2, axis=1, sort=False, join='inner')
valueA valueB valueC
key
D 2.240893 -0.977278 1.0
ফেরত join='inner'
একটি পূর্ণ বাহ্য জন্য যোগ দিন। মনে রাখবেন যে আপনি বাম বা ডানদিকে বাইরে যোগ দিতে পারবেন না (যদি আপনার এগুলির প্রয়োজন হয় তবে ব্যবহার করুনjoin
নীচে বর্ণিত )।
ডুপ্লিকেট সহ কীগুলিতে মাল্টিওয়ে একত্রীকরণ
concat
দ্রুত, তবে এর কমতি রয়েছে। এটি সদৃশগুলি পরিচালনা করতে পারে না।
A3 = pd.DataFrame({'key': ['A', 'B', 'C', 'D', 'D'], 'valueA': np.random.randn(5)})
pd.concat([df.set_index('key') for df in [A3, B, C]], axis=1, join='inner')
ValueError: Shape of passed values is (3, 4), indices imply (3, 2)
এই পরিস্থিতিতে, আমরা এটি ব্যবহার করতে পারি join
যেহেতু এটি অ-অনন্য কীগুলি পরিচালনা করতে পারে (নোট করুন যে join
তাদের সূচীতে ডেটাফ্রেমে যোগ দেয়; এটি merge
হুডের নীচে কল করে এবং অন্যথায় নির্দিষ্ট না করা পর্যন্ত একটি বাম আউটার জয়েন করে)।
# join on `key` column, set as the index first
# For inner join. For left join, omit the "how" argument.
A.set_index('key').join(
[df.set_index('key') for df in (B, C)], how='inner').reset_index()
key valueA valueB valueC
0 D 2.240893 -0.977278 1.0
# join on `key` index
A3.set_index('key').join([B2, C2], how='inner')
valueA valueB valueC
key
D 1.454274 -0.977278 1.0
D 0.761038 -0.977278 1.0