আমি একটি দুটি কলাম ডেটাফ্রেম করেছি এবং এটি পাইথন অভিধানে রূপান্তর করতে চাইছি - প্রথম কলামটি মূল হবে এবং দ্বিতীয়টি মান হবে। তুমাকে অগ্রিম ধন্যবাদ.
Dataframe:
id value
0 0 10.2
1 1 5.7
2 2 7.4
আমি একটি দুটি কলাম ডেটাফ্রেম করেছি এবং এটি পাইথন অভিধানে রূপান্তর করতে চাইছি - প্রথম কলামটি মূল হবে এবং দ্বিতীয়টি মান হবে। তুমাকে অগ্রিম ধন্যবাদ.
Dataframe:
id value
0 0 10.2
1 1 5.7
2 2 7.4
উত্তর:
এর জন্য দস্তাবেজগুলি দেখুন to_dict। আপনি এটি এর মতো ব্যবহার করতে পারেন:
df.set_index('id').to_dict()
এবং যদি আপনার কেবলমাত্র একটি কলাম থাকে, কলামের নামটি এড়াতে ডিকের একটি স্তরও (আসলে, আপনি এই ক্ষেত্রে আপনি এটি ব্যবহার করেন Series.to_dict()):
df.set_index('id')['value'].to_dict()
>>> ptest = p.DataFrame([['a',1],['a',2],['b',3]], columns=['id', 'value']) >>> ptest.set_index('id')['value'].to_dict()
mydict = dict(zip(df.id, df.value))
আপনি যদি সদৃশ সংরক্ষণের কোনও সহজ উপায় চান তবে আপনি এটি ব্যবহার করতে পারেন groupby:
>>> ptest = pd.DataFrame([['a',1],['a',2],['b',3]], columns=['id', 'value'])
>>> ptest
id value
0 a 1
1 a 2
2 b 3
>>> {k: g["value"].tolist() for k,g in ptest.groupby("id")}
{'a': [1, 2], 'b': [3]}
এই থ্রেডটিতে জুরি এবং ডুপ্লিকেটড থ্রেডে পাঞ্চগান দ্বারা দেওয়া উত্তরগুলি খুব মার্জিত, তবে কীগুলির জন্য ব্যবহৃত কলামটিতে কোনও সদৃশ মান রয়েছে তবে তারা সঠিক ফলাফল দেবে না।
উদাহরণ স্বরূপ:
>>> ptest = p.DataFrame([['a',1],['a',2],['b',3]], columns=['id', 'value'])
>>> ptest
id value
0 a 1
1 a 2
2 b 3
# note that in both cases the association a->1 is lost:
>>> ptest.set_index('id')['value'].to_dict()
{'a': 2, 'b': 3}
>>> dict(zip(ptest.id, ptest.value))
{'a': 2, 'b': 3}
যদি আপনার সদৃশ এন্ট্রি থাকে এবং সেগুলি হারাতে না চান তবে আপনি এই কুরুচিপূর্ণ কিন্তু কার্যকারী কোডটি ব্যবহার করতে পারেন:
>>> mydict = {}
>>> for x in range(len(ptest)):
... currentid = ptest.iloc[x,0]
... currentvalue = ptest.iloc[x,1]
... mydict.setdefault(currentid, [])
... mydict[currentid].append(currentvalue)
>>> mydict
{'a': [1, 2], 'b': [3]}
mydict = defaultdict(list)\n for (key, val) in ptest[["id", "value"]].itertuples(index=False):\n mydict[key].append(val)
সহজ সমাধান:
df.set_index('id').T.to_dict('records')
উদাহরণ:
df= pd.DataFrame([['a',1],['a',2],['b',3]], columns=['id','value'])
df.set_index('id').T.to_dict('records')
আপনার যদি মান 1, ভ্যাল 2, ভাল 3 ইত্যাদি থাকে এবং আপনি সেগুলি তালিকা হিসাবে চান তবে নীচের কোডটি ব্যবহার করুন:
df.set_index('id').T.to_dict('list')
recordsএখানে মানে কি ?
কিছু সংস্করণে নীচের কোডটি কাজ নাও করতে পারে
mydict = dict(zip(df.id, df.value))
সুতরাং এটি স্পষ্ট করা
id_=df.id.values
value=df.value.values
mydict=dict(zip(id_,value))
নোট আমি আইডি ব্যবহার করেছি কারণ আইডি শব্দটি সংরক্ষিত শব্দ
আপনি 'ডিক্স বোধগম্যতা' ব্যবহার করতে পারেন
my_dict = {row[0]: row[1] for row in df.values}
সদৃশ এন্ট্রি না হারানোর জন্য আরেকটি (সামান্য সংক্ষিপ্ত) সমাধান:
>>> ptest = pd.DataFrame([['a',1],['a',2],['b',3]], columns=['id','value'])
>>> ptest
id value
0 a 1
1 a 2
2 b 3
>>> pdict = dict()
>>> for i in ptest['id'].unique().tolist():
... ptest_slice = ptest[ptest['id'] == i]
... pdict[i] = ptest_slice['value'].tolist()
...
>>> pdict
{'b': [3], 'a': [1, 2]}
পান্ডের ডেটাফ্রেমের তিনটি কলামের মধ্যে অভিধান তৈরি করার চেষ্টা করার সময় আমি এই প্রশ্নটি পেয়েছি। আমার ক্ষেত্রে ডেটাফ্রেমে এ, বি এবং সি কলাম রয়েছে (ধরা যাক এ এবং বি দ্রাঘিমাংশ এবং অক্ষাংশের ভূগোলিক স্থানাঙ্ক এবং সি অঞ্চল / রাজ্য / ইত্যাদি, যা কমবেশি ক্ষেত্রে হয়)।
আমি প্রতিটি জোড় ক, বি মান (অভিধান কী) এর সাথে সংশ্লিষ্ট সারিতে সি (অভিধানের মান) এর মান মেলে একটি অভিধান চাইছিলাম (এ, বি মানের প্রতিটি জোড়ই পূর্ববর্তী ফিল্টারিংয়ের কারণে অনন্য হওয়ার গ্যারান্টিযুক্ত) তবে এটি এই প্রসঙ্গে A, B মানের বিভিন্ন জোড়ার জন্য সি এর সমান মান পাওয়া সম্ভব), তাই আমি করেছি:
mydict = dict(zip(zip(df['A'],df['B']), df['C']))
প্যানডাস টু ডিক্ট () ব্যবহার করে:
mydict = df.set_index(['A','B']).to_dict(orient='dict')['C']
(অভিধান তৈরির লাইনটি কার্যকর করার আগে A বা B কলামগুলির কোনওটিই সূচক হিসাবে ব্যবহৃত হয়নি)
উভয় পন্থা দ্রুত (85k সারি, 5 বছরের পুরানো দ্রুত ডুয়াল-কোর ল্যাপটপ সহ ডেটাফ্রেমে এক সেকেন্ডেরও কম)।
যে কারণে আমি এটি পোস্ট করছি:
def get_dict_from_pd(df, key_col, row_col):
result = dict()
for i in set(df[key_col].values):
is_i = df[key_col] == i
result[i] = list(df[is_i][row_col].values)
return result
এটি আমার স্লুইশন, একটি মৌলিক লুপ