একটি পান্ডাস ডেটা ফ্রেমকে অভিধানে রূপান্তর করুন


168

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

DataFrame:

    ID   A   B   C
0   p    1   3   2
1   q    4   3   2
2   r    4   0   9  

আউটপুট এর মতো হওয়া উচিত:

অভিধান:

{'p': [1,3,2], 'q': [4,3,2], 'r': [4,0,9]}

4
Dataframe.to_dict()?
আনজেল

3
Dataframe.to_dict()এর A,B,Cপরিবর্তে কীগুলি তৈরি করবেp,q,r
যুবরাজ ভাট্টি

নিচের আউটপুটটি কীভাবে পাবেন? Dat 2: {'পি': [1,3]}, 2: q 'কিউ': [4,3]}, 9: {'আর': [4,0] dat the একই ডেটাসেটের জন্য?
পান্ডা

উপরের প্রশ্নের je 'সি': z 'আইডি': 'এ', 'বি'}}
পান্ডা

উত্তর:


337

to_dict()পদ্ধতি অভিধান কী হিসেবে কলাম নামে সেট করে যাতে আপনি আপনার DataFrame সামান্য পুনর্নির্মাণ করতে হবে। সূচক হিসাবে 'আইডি' কলাম সেট করা এবং তারপরে ডেটাফ্রেম স্থানান্তর করা এ অর্জনের এক উপায়।

to_dict()এছাড়াও একটি 'প্রাচ্য' যুক্তি গ্রহণ করে যা প্রতিটি কলামের জন্য মানের একটি তালিকা আউটপুট করার জন্য আপনার প্রয়োজন হবে । অন্যথায়, ফর্মের একটি অভিধান {index: value}প্রতিটি কলামের জন্য ফিরে আসবে।

এই পদক্ষেপগুলি নিম্নলিখিত লাইনের সাহায্যে করা যেতে পারে:

>>> df.set_index('ID').T.to_dict('list')
{'p': [1, 3, 2], 'q': [4, 3, 2], 'r': [4, 0, 9]}

যদি কোনও ভিন্ন অভিধানের বিন্যাসের প্রয়োজন হয় তবে এখানে সম্ভাব্য প্রাচ্য যুক্তির উদাহরণ রয়েছে। নিম্নলিখিত সহজ ডেটা ফ্রেম বিবেচনা করুন:

>>> df = pd.DataFrame({'a': ['red', 'yellow', 'blue'], 'b': [0.5, 0.25, 0.125]})
>>> df
        a      b
0     red  0.500
1  yellow  0.250
2    blue  0.125

তারপরে অপশনগুলি নিম্নরূপ।

ডিক - ডিফল্ট: কলামের নামগুলি কীগুলি হয়, মানগুলি সূচকের অভিধান হয়: ডেটা জোড়া

>>> df.to_dict('dict')
{'a': {0: 'red', 1: 'yellow', 2: 'blue'}, 
 'b': {0: 0.5, 1: 0.25, 2: 0.125}}

তালিকা - কীগুলি কলামের নাম, মানগুলি কলামের ডেটাগুলির তালিকা

>>> df.to_dict('list')
{'a': ['red', 'yellow', 'blue'], 
 'b': [0.5, 0.25, 0.125]}

সিরিজ - 'তালিকার মতো' তবে মানগুলি হল সিরিজ

>>> df.to_dict('series')
{'a': 0       red
      1    yellow
      2      blue
      Name: a, dtype: object, 

 'b': 0    0.500
      1    0.250
      2    0.125
      Name: b, dtype: float64}

বিভাজন - কলাম হিসাবে ডেটা / সূচকগুলি কলাম হিসাবে নামগুলি, সারি অনুসারে ডাটা মান এবং সূচক লেবেলগুলি যথাক্রমে বিভক্ত হয়

>>> df.to_dict('split')
{'columns': ['a', 'b'],
 'data': [['red', 0.5], ['yellow', 0.25], ['blue', 0.125]],
 'index': [0, 1, 2]}

রেকর্ডস - প্রতিটি সারি একটি অভিধানে পরিণত হয় যেখানে কীটি কলামের নাম এবং মানটি ঘরের ডেটা হয়

>>> df.to_dict('records')
[{'a': 'red', 'b': 0.5}, 
 {'a': 'yellow', 'b': 0.25}, 
 {'a': 'blue', 'b': 0.125}]

সূচি - 'রেকর্ড' এর মতো, তবে কীগুলির সাথে অভিধানের অভিধানের সূচি লেবেল হিসাবে (তালিকার চেয়ে)

>>> df.to_dict('index')
{0: {'a': 'red', 'b': 0.5},
 1: {'a': 'yellow', 'b': 0.25},
 2: {'a': 'blue', 'b': 0.125}}

14
এটি একটি লাইনার হবে:df.set_index('ID').T.to_dict('list')
আনজেল

1
ডেটা ফ্রেমে একটি রেকর্ডের জন্য। df.T.to_dict () [0]
কামরান কাউসার

23

ব্যবহার করার চেষ্টা করুন Zip

df = pd.read_csv("file")
d= dict([(i,[a,b,c ]) for i, a,b,c in zip(df.ID, df.A,df.B,df.C)])
print d

আউটপুট:

{'p': [1, 3, 2], 'q': [4, 3, 2], 'r': [4, 0, 9]}

21

এই পদক্ষেপগুলি অনুসরণ করুন:

মনে করুন আপনার ডেটাফ্রেমটি নিম্নরূপ:

>>> df
   A  B  C ID
0  1  3  2  p
1  4  3  2  q
2  4  0  9  r

1. কলামগুলি ডেটাফ্রেম সূচক হিসাবে set_indexসেট করতে ব্যবহার করুন ID

    df.set_index("ID", drop=True, inplace=True)

২. orient=indexঅভিধান কী হিসাবে সূচকটি পেতে প্যারামিটারটি ব্যবহার করুন ।

    dictionary = df.to_dict(orient="index")

ফলাফলগুলি নিম্নরূপ হবে:

    >>> dictionary
    {'q': {'A': 4, 'B': 3, 'D': 2}, 'p': {'A': 1, 'B': 3, 'D': 2}, 'r': {'A': 4, 'B': 0, 'D': 9}}

৩. আপনার যদি প্রতিটি নমুনা প্রয়োজন হয় তবে নীচের কোডটি চালান। কলামের ক্রম নির্ধারণ করুন

column_order= ["A", "B", "C"] #  Determine your preferred order of columns
d = {} #  Initialize the new dictionary as an empty dictionary
for k in dictionary:
    d[k] = [dictionary[k][column_name] for column_name in column_order]

2
শেষ বিটের জন্য মনে হচ্ছে আপনি লুপ + তালিকার উপলব্ধি (3 লাইন -> 1) প্রতিস্থাপনের জন্য ডিক বোঝাপড়াটি ব্যবহার করে সহজ হবেন। যে কোনও উপায়ে, অপশন থাকা ভাল হলেও, শীর্ষের উত্তরটি অনেক ছোট।
চমত্কার

এটি অনায়াসে কার্যকর কারণ এটি সূচক হিসাবে নির্দিষ্ট কলাম বা শিরোনাম কীভাবে ব্যবহার করতে হয় তা স্পষ্টভাবে ব্যাখ্যা করে।
গ্রীষ্মমন্ডলীয়

10

আপনি যদি অভিধানের মানগুলিকে টিপলস বলে মনে না করেন তবে আপনি ইটারটুপলসটি ব্যবহার করতে পারেন:

>>> {x[0]: x[1:] for x in df.itertuples(index=False)}
{'p': (1, 3, 2), 'q': (4, 3, 2), 'r': (4, 0, 9)}

7

অভিধানের মতো হওয়া উচিত:

{'red': '0.500', 'yellow': '0.250, 'blue': '0.125'}

যেমন একটি ডেটা ফ্রেম বাইরে প্রয়োজন:

        a      b
0     red  0.500
1  yellow  0.250
2    blue  0.125

সহজ উপায়টি হ'ল:

dict(df.values.tolist())

নীচে কাজ স্নিপেট:

import pandas as pd
df = pd.DataFrame({'a': ['red', 'yellow', 'blue'], 'b': [0.5, 0.25, 0.125]})
dict(df.values.tolist())

এখানে চিত্র বর্ণনা লিখুন


2

আমার ব্যবহারের জন্য (xy পজিশনের সাথে নোডের নামগুলি) আমি সর্বাধিক সহায়ক / স্বজ্ঞাত এর কাছে @ ব্যবহারকারীর ১1717৯77's এর উত্তর খুঁজে পেয়েছি:

import pandas as pd

df = pd.read_csv('glycolysis_nodes_xy.tsv', sep='\t')

df.head()
    nodes    x    y
0  c00033  146  958
1  c00031  601  195
...

xy_dict_list=dict([(i,[a,b]) for i, a,b in zip(df.nodes, df.x,df.y)])

xy_dict_list
{'c00022': [483, 868],
 'c00024': [146, 868],
 ... }

xy_dict_tuples=dict([(i,(a,b)) for i, a,b in zip(df.nodes, df.x,df.y)])

xy_dict_tuples
{'c00022': (483, 868),
 'c00024': (146, 868),
 ... }

অভিযোজ্য বস্তু

আমি পরে অন্যান্য, তবে সম্পর্কিত, কাজের জন্য এই ইস্যুটিতে ফিরে এসেছি। এখানে এমন একটি দৃষ্টিভঙ্গি যা [নিখুঁত] গৃহীত উত্তরকে আরও ঘনিষ্ঠভাবে আয়না করে।

node_df = pd.read_csv('node_prop-glycolysis_tca-from_pg.tsv', sep='\t')

node_df.head()
   node  kegg_id kegg_cid            name  wt  vis
0  22    22       c00022   pyruvate        1   1
1  24    24       c00024   acetyl-CoA      1   1
...

পান্ডাস ডেটাফ্রেমকে একটি [তালিকা], {ডিক্ট}, {ডিক্টের {ডিক}}, ... তে রূপান্তর করুন

প্রতি গৃহীত উত্তর:

node_df.set_index('kegg_cid').T.to_dict('list')

{'c00022': [22, 22, 'pyruvate', 1, 1],
 'c00024': [24, 24, 'acetyl-CoA', 1, 1],
 ... }

node_df.set_index('kegg_cid').T.to_dict('dict')

{'c00022': {'kegg_id': 22, 'name': 'pyruvate', 'node': 22, 'vis': 1, 'wt': 1},
 'c00024': {'kegg_id': 24, 'name': 'acetyl-CoA', 'node': 24, 'vis': 1, 'wt': 1},
 ... }

আমার ক্ষেত্রে, আমি একই জিনিসটি করতে চেয়েছিলাম তবে পান্ডস ডেটাফ্রেমে নির্বাচিত কলামগুলি দিয়েছিলাম, তাই আমার কলামগুলি টুকরো টুকরো করা দরকার। দুটি পন্থা আছে।

  1. সরাসরি:

(দেখুন: মূল মানগুলির জন্য ব্যবহৃত কলামগুলি সংজ্ঞায়িত করে পান্ডাকে অভিধানে রূপান্তর করুন )

node_df.set_index('kegg_cid')[['name', 'wt', 'vis']].T.to_dict('dict')

{'c00022': {'name': 'pyruvate', 'vis': 1, 'wt': 1},
 'c00024': {'name': 'acetyl-CoA', 'vis': 1, 'wt': 1},
 ... }
  1. "অপ্রত্যক্ষভাবে:" প্রথমে পান্ডাস ডেটাফ্রেমে (আবার দুটি পন্থা) থেকে কাঙ্ক্ষিত কলাম / ডেটা স্লাইস করুন,
node_df_sliced = node_df[['kegg_cid', 'name', 'wt', 'vis']]

অথবা

node_df_sliced2 = node_df.loc[:, ['kegg_cid', 'name', 'wt', 'vis']]

এরপরে অভিধানের অভিধান তৈরি করতে ব্যবহার করা যেতে পারে

node_df_sliced.set_index('kegg_cid').T.to_dict('dict')

{'c00022': {'name': 'pyruvate', 'vis': 1, 'wt': 1},
 'c00024': {'name': 'acetyl-CoA', 'vis': 1, 'wt': 1},
 ... }

-1

DataFrame.to_dict() ডেটাফ্রেমকে অভিধানে রূপান্তর করে।

উদাহরণ

>>> df = pd.DataFrame(
    {'col1': [1, 2], 'col2': [0.5, 0.75]}, index=['a', 'b'])
>>> df
   col1  col2
a     1   0.1
b     2   0.2
>>> df.to_dict()
{'col1': {'a': 1, 'b': 2}, 'col2': {'a': 0.5, 'b': 0.75}}

বিশদ জন্য এই ডকুমেন্টেশন দেখুন


2
হ্যাঁ, তবে ওপি স্পষ্ট করে জানিয়েছে যে তারা সারি সূচকে কী হতে পারে, কলাম লেবেলগুলি নয়।
ভিকি বি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.