অভিধানে পাইথন পান্ডাস ডেটা ফ্রেম


111

আমি একটি দুটি কলাম ডেটাফ্রেম করেছি এবং এটি পাইথন অভিধানে রূপান্তর করতে চাইছি - প্রথম কলামটি মূল হবে এবং দ্বিতীয়টি মান হবে। তুমাকে অগ্রিম ধন্যবাদ.

Dataframe:

    id    value
0    0     10.2
1    1      5.7
2    2      7.4

সম্ভাব্য প্রতিলিপির: stackoverflow.com/questions/18012505/...
dalloliogm

আপনি কি এটি পরীক্ষা করে দেখেছেন
user2290820

4
@ স্পেরি: প্রশ্নটি সমাধান হিসাবে চিহ্নিত করার জন্য আপনি কি কোনও উত্তর (সহায়ক হলে) গ্রহণ করতে পারেন? এটি অন্যান্য ব্যবহারকারীদেরও সহায়তা করবে।
মেরোস

আপনার যদি কোনও আইডি থাকে যা সূচকের সাথে মিলে যায় তবে আপনাকে এটি সূচক হিসাবে সেট করা উচিত।
ফারিস

উত্তর:


152

এর জন্য দস্তাবেজগুলি দেখুন to_dict। আপনি এটি এর মতো ব্যবহার করতে পারেন:

df.set_index('id').to_dict()

এবং যদি আপনার কেবলমাত্র একটি কলাম থাকে, কলামের নামটি এড়াতে ডিকের একটি স্তরও (আসলে, আপনি এই ক্ষেত্রে আপনি এটি ব্যবহার করেন Series.to_dict()):

df.set_index('id')['value'].to_dict()

14
নোট করুন যে আইডি কলামগুলিতে অপ্রয়োজনীয় মান থাকলে এই আদেশটি ডেটা হারাবে: >>> ptest = p.DataFrame([['a',1],['a',2],['b',3]], columns=['id', 'value']) >>> ptest.set_index('id')['value'].to_dict()
ডালোলিওগম

9
আমার বলতে হবে, ডক্স লিঙ্কে এমন কোনও কিছুই নেই যা আমাকে এই প্রশ্নের উত্তর দিয়েছে।
বেন ফুলটন

@ বোম্বায়েক্যান্ট ডিএসএম এর এবং নীচে আমার উত্তরগুলি দেখুন। মনে রাখবেন এটি একটি 4 বছরের পুরনো আলোচনা।
dalloliogm


47

আপনি যদি সদৃশ সংরক্ষণের কোনও সহজ উপায় চান তবে আপনি এটি ব্যবহার করতে পারেন 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]}

1
দুর্দান্ত এবং মার্জিত সমাধান, তবে 50k সারি টেবিলের উপরে, এটি নীচের আমার কুশল সমাধানের চেয়ে প্রায় 6 গুণ ধীর।
ডালোলিওগম

@ ডালোলিওগম: আপনি কি উদাহরণ সারণী দিতে পারেন যা এর জন্য ঘটে? যদি এটি পাইথন লুপের চেয়ে ছয়গুণ ধীর হয় তবে পান্ডসে পারফরম্যান্স বাগ থাকতে পারে।
ডিএসএম

23

এই থ্রেডটিতে জুরি এবং ডুপ্লিকেটড থ্রেডে পাঞ্চগান দ্বারা দেওয়া উত্তরগুলি খুব মার্জিত, তবে কীগুলির জন্য ব্যবহৃত কলামটিতে কোনও সদৃশ মান রয়েছে তবে তারা সঠিক ফলাফল দেবে না।

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

>>> 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]}

2
মন্তব্যে কোনও ব্লকের অভাবের কারণে বিন্যাসটি ক্ষমা করুন:mydict = defaultdict(list)\n for (key, val) in ptest[["id", "value"]].itertuples(index=False):\n mydict[key].append(val)
মিডনাইটার

1
ওয়ান-লাইনারের মতো মার্জিত না হলেও আপনার সমাধানটি আমি অনেক বেশি পছন্দ করেছি।
পিটার মাগুইরে

9

সহজ সমাধান:

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')

1
recordsএখানে মানে কি ?
মিঙ্গচাউ 31'19

1
@ মঞ্চচাউ এর recordsঅর্থ এখানে পান্ডাস.পিডেটা.আর.এ.পি. ‘records’ : list like [{column -> value}, … , {column -> value}] দেখুন / প্যান্ডাস
ডকস /

8

কিছু সংস্করণে নীচের কোডটি কাজ নাও করতে পারে

mydict = dict(zip(df.id, df.value))

সুতরাং এটি স্পষ্ট করা

id_=df.id.values
value=df.value.values
mydict=dict(zip(id_,value))

নোট আমি আইডি ব্যবহার করেছি কারণ আইডি শব্দটি সংরক্ষিত শব্দ


7

আপনি 'ডিক্স বোধগম্যতা' ব্যবহার করতে পারেন

my_dict = {row[0]: row[1] for row in df.values}

পান্ডার সাথে লুপিং মেমরির ব্যবহারের ক্ষেত্রে সবচেয়ে কার্যকর নয়। দেখুন: ইঞ্জিনিয়ারিং.আপসাইড.
com/…

ওপি সবচেয়ে কার্যকর উত্তরটির জন্য জিজ্ঞাসা করেনি তাই আমি মনে করি @ ডংওয়ান কিম চমৎকার বিকল্প সমাধান সরবরাহ করেছে।
একজন অর্থনীতিবিদ

3

সদৃশ এন্ট্রি না হারানোর জন্য আরেকটি (সামান্য সংক্ষিপ্ত) সমাধান:

>>> 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]}

1

অভিধান মান হিসাবে আপনার একটি তালিকা দরকার। এই কোডটি কৌশলটি করবে।

from collections import defaultdict
mydict = defaultdict(list)
for k, v in zip(df.id.values,df.value.values):
    mydict[k].append(v)

1

পান্ডের ডেটাফ্রেমের তিনটি কলামের মধ্যে অভিধান তৈরি করার চেষ্টা করার সময় আমি এই প্রশ্নটি পেয়েছি। আমার ক্ষেত্রে ডেটাফ্রেমে এ, বি এবং সি কলাম রয়েছে (ধরা যাক এ এবং বি দ্রাঘিমাংশ এবং অক্ষাংশের ভূগোলিক স্থানাঙ্ক এবং সি অঞ্চল / রাজ্য / ইত্যাদি, যা কমবেশি ক্ষেত্রে হয়)।

আমি প্রতিটি জোড় ক, বি মান (অভিধান কী) এর সাথে সংশ্লিষ্ট সারিতে সি (অভিধানের মান) এর মান মেলে একটি অভিধান চাইছিলাম (এ, বি মানের প্রতিটি জোড়ই পূর্ববর্তী ফিল্টারিংয়ের কারণে অনন্য হওয়ার গ্যারান্টিযুক্ত) তবে এটি এই প্রসঙ্গে 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 বছরের পুরানো দ্রুত ডুয়াল-কোর ল্যাপটপ সহ ডেটাফ্রেমে এক সেকেন্ডেরও কম)।

যে কারণে আমি এটি পোস্ট করছি:

  1. যারা এই ধরণের সমাধান প্রয়োজন
  2. যদি কেউ দ্রুত সম্পাদনকারী সমাধান (উদাহরণস্বরূপ, কয়েক মিলিয়ন সারিগুলির জন্য) জানেন তবে আমি একটি উত্তরকে প্রশংসা করব।

0
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

এটি আমার স্লুইশন, একটি মৌলিক লুপ


0

এটি আমার সমাধান:

import pandas as pd
df = pd.read_excel('dic.xlsx')
df_T = df.set_index('id').T
dic = df_T.to_dict('records')
print(dic)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.