একসাথে কলামগুলি মেলাতে পান্ডাস ডেটা ফ্রেমের ডেটা ব্যবহার করুন


18

আমার কাছে দুটি pandasডেটা ফ্রেম রয়েছে aএবং b:

a1   a2   a3   a4   a5   a6   a7
1    3    4    5    3    4    5
0    2    0    3    0    2    1
2    5    6    5    2    1    2

এবং

b1   b2   b3   b4   b5   b6   b7
3    5    4    5    1    4    3
0    1    2    3    0    0    2
2    2    1    5    2    6    5

দুটি ডেটা ফ্রেমে হুবহু একই ডেটা থাকে তবে ভিন্ন অর্ডারে এবং বিভিন্ন কলামের নাম সহ। দুটি ডেটা ফ্রেম সংখ্যা উপর ভিত্তি করে, আমি প্রতিটি কলামের নাম মেলে পাবে চাই aপ্রতিটি কলামের নাম b

সদৃশ মানগুলির যেমন aপ্রথম সারিটির প্রথম সারিটির সাথে তুলনা করা তত সহজ নয় b, উদাহরণস্বরূপ, উভয়ই a4এবং a7এর মানও 5তাই এটির সাথে তত্ক্ষণাত কোনওটি মিলানো সম্ভব নয় b2বা b4

এই কাজ করতে সবচেয়ে ভালো উপায় কি?

উত্তর:


16

এখানে ব্যবহারের একটি উপায় sort_values:

m=df1.T.sort_values(by=[*df1.index]).index
n=df2.T.sort_values(by=[*df2.index]).index
d=dict(zip(m,n))
print(d)

{'a1': 'b5', 'a5': 'b1', 'a2': 'b7', 'a3': 'b6', 'a6': 'b3', 'a7': 'b2', 'a4': 'b4'}

অ্যানকি সুন্দর কমান্ড ভাগ করে নেওয়ার জন্য আপনাকে ধন্যবাদ, আপনি দয়া করে কিছু [*df1.index]অংশে আরও ব্যাখ্যা করতে পারেন ? চিয়ার্স আপনার প্রতি কৃতজ্ঞ হবে।
রবীন্দ্রসিংহ

1
@ রবীন্দ্রসিংহ 13 অবশ্যই, sort_values(by=..)প্যারামিটার হিসাবে একটি তালিকা নিয়েছে তাই আমি এখানে একটি তালিকায় list(df1.index)[*df1.index]
সূচিটি

16

এখানে একরকম উপায়ে লিভারেজ করা broadcasting:

b_cols = b.columns[(a.values == b.T.values[...,None]).all(1).argmax(1)]
dict(zip(a, b_cols))

{'a1': 'b5',
 'a2': 'b7',
 'a3': 'b6',
 'a4': 'b4',
 'a5': 'b1',
 'a6': 'b3',
 'a7': 'b2'}

আর একটি অনুরূপ পন্থা (@ পিআইআর দ্বারা):

a_ = a.to_numpy()
b_ = b.to_numpy()
i, j = np.where((a_[:, None, :] == b_[:, :, None]).all(axis=0))
dict(zip(a.columns[j], b.columns[i]))

{'a1': 'b5',
 'a2': 'b7',
 'a3': 'b6',
 'a4': 'b4',
 'a5': 'b1',
 'a6': 'b3',
 'a7': 'b2'}

1
আমি আপনার পোস্টে আমার নাক আটকেছি আশা করি, আপনি কিছু মনে করবেন না। দয়া করে এটি আপনার পছন্দ অনুসারে পরিবর্তন করুন।
পিআরআর

বিপরীতভাবে আহ :) চমৎকার পদ্ধতির, এবং বড় ডেটা ফ্রেমগুলি পরীক্ষা করে এটি কিছুটা পারফরম্যান্সের উন্নতি করে @ পিআইআরস্কয়ার্ড
ইয়াতু

12

একটি উপায় merge

s=df1.T.reset_index().merge(df2.T.assign(match=lambda x : x.index))
dict(zip(s['index'],s['match']))
{'a1': 'b5', 'a2': 'b7', 'a3': 'b6', 'a4': 'b4', 'a5': 'b1', 'a6': 'b3', 'a7': 'b2'}

আমি ভেবেছিলাম আমি কেবল একটি চতুর সমাধান যুক্ত করব এটি দেখতে যে এটি আপনার মত একই ছিল (-:
ওফস

8

অভিধান বোঝা

tupleঅভিধানে হ্যাশযোগ্য কী হিসাবে কলাম মানগুলির একটি ব্যবহার করুন

d = {(*t,): c for c, t in df2.items()}
{c: d[(*t,)] for c, t in df1.items()}

{'a1': 'b5',
 'a2': 'b7',
 'a3': 'b6',
 'a4': 'b4',
 'a5': 'b1',
 'a6': 'b3',
 'a7': 'b2'}

কেবলমাত্র আমাদের নিখুঁত উপস্থাপনা না থাকলে, আমি কেবল সেখানে কলামগুলির জন্য মিল তৈরি করেছি যেখানে একটি মিল আছে।

d2 = {(*t,): c for c, t in df2.items()}
d1 = {(*t,): c for c, t in df1.items()}

{d1[c]: d2[c] for c in {*d1} & {*d2}}

{'a5': 'b1',
 'a2': 'b7',
 'a7': 'b2',
 'a6': 'b3',
 'a3': 'b6',
 'a1': 'b5',
 'a4': 'b4'}

idxmax

অযৌক্তিক এই সীমানা ... আসলে এটি করবেন না।

{c: df2.T.eq(df1[c]).sum(1).idxmax() for c in df1}

{'a1': 'b5',
 'a2': 'b7',
 'a3': 'b6',
 'a4': 'b4',
 'a5': 'b1',
 'a6': 'b3',
 'a7': 'b2'}

1
এটি কীভাবে হয়, আমি এই বিবৃতিগুলিতে প্রতিটি অভিব্যক্তি বুঝতে পারি, তবুও আমার মাথায় পুরোপুরি দেখতে পাচ্ছি না যে এখানে আসলে কী চলছে? দাবার মতো কিন্ডা, আমি জানি বোর্ডে সমস্ত টুকরো কীভাবে সরানো যায়, তবে আরও 2 টি এগিয়ে যেতে পারে না ahead
স্কট বোস্টন

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