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


655

আমার কাছে অভিধানের একটি তালিকা রয়েছে:

[{'points': 50, 'time': '5:00', 'year': 2010}, 
{'points': 25, 'time': '6:00', 'month': "february"}, 
{'points':90, 'time': '9:00', 'month': 'january'}, 
{'points_h1':20, 'month': 'june'}]

এবং আমি এটি এর DataFrameমতো একটি পান্ডায় রূপান্তর করতে চাই:

      month  points  points_h1  time  year
0       NaN      50        NaN  5:00  2010
1  february      25        NaN  6:00   NaN
2   january      90        NaN  9:00   NaN
3      june     NaN         20   NaN   NaN

দ্রষ্টব্য: কলামগুলির ক্রম কোনও ব্যাপার নয়।

উপরের মতো আমি কীভাবে অভিধানের তালিকাটিকে একটি পান্ডাস ডেটা ফ্রেমে রূপান্তর করতে পারি?

উত্তর:


948

ধরুন dআপনার খোলগুলির তালিকাটি সহজভাবে:

pd.DataFrame(d)

3
কীভাবে কেউ কী / মান সংখ্যার একটিকে সূচক (উদাহরণস্বরূপ) হিসাবে ব্যবহার করতে পারে?
বিড়াললভজাজ

6
@CatsLoveJazz আপনি শুধু করতে পারি না df = df.set_index('time')পরে
Joris

1
@ ক্যাটসলভজাজ না, ডিক থেকে রূপান্তর করার সময় এটি সম্ভব নয়।
জুরিস

6
পান্ডাস ০.০৯.২.২ হিসাবে, ডকুমেন্টেশনে এটির কোনও উল্লেখ নেই, কমপক্ষে নথিতে নেইpandas.DataFrame
লিও আলেক্সিয়েভ

1
মনে রাখবেন যে কোনও নেস্টেড ডিকশনারিটির জন্য '{"":{"...আপনি json_normalize পদ্ধতির ব্যবহার করেন, @ সিএস 95 এর বিস্তারিত উত্তরটি দেখুন
লরেঞ্জ

136

আমি কীভাবে অভিধানের একটি তালিকাকে একটি পান্ডাস ডেটা ফ্রেমে রূপান্তর করব?

অন্যান্য উত্তরগুলি সঠিক, তবে এই পদ্ধতির সুবিধা এবং সীমাবদ্ধতার ক্ষেত্রে খুব বেশি ব্যাখ্যা করা হয়নি। এই পোস্টের লক্ষ্য হ'ল বিভিন্ন পরিস্থিতিতে এই পদ্ধতির উদাহরণ দেখানো, কখন ব্যবহার করবেন (এবং কখন ব্যবহার করবেন না) আলোচনা করা এবং বিকল্প পরামর্শ দেওয়া।


DataFrame(), DataFrame.from_records()এবং.from_dict()

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

একটি খুব স্বীকৃত উদাহরণ বিবেচনা করুন।

np.random.seed(0)
data = pd.DataFrame(
    np.random.choice(10, (3, 4)), columns=list('ABCD')).to_dict('r')

print(data)
[{'A': 5, 'B': 0, 'C': 3, 'D': 3},
 {'A': 7, 'B': 9, 'C': 3, 'D': 5},
 {'A': 2, 'B': 4, 'C': 7, 'D': 6}]

এই তালিকাটিতে উপস্থিত প্রতিটি কীগুলির সাথে "রেকর্ডস" রয়েছে। এটি আপনার মুখোমুখি হতে পারে এমন সহজতম ঘটনা।

# The following methods all produce the same output.
pd.DataFrame(data)
pd.DataFrame.from_dict(data)
pd.DataFrame.from_records(data)

   A  B  C  D
0  5  0  3  3
1  7  9  3  5
2  2  4  7  6

অভিধান ওরিয়েন্টেশন অন শব্দ: orient='index'/'columns'

চালিয়ে যাওয়ার আগে, অভিধানের বিভিন্ন ধরণের দিকনির্দেশের মধ্যে পার্থক্য করা এবং পান্ডার সাহায্যে গুরুত্বপূর্ণ। দুটি প্রাথমিক প্রকার রয়েছে: "কলাম" এবং "সূচক"।

orient='columns'
"কলাম" ওরিয়েন্টেশন সহ শব্দকোষগুলির কীগুলি সমতুল্য ডেটা ফ্রেমের কলামের সাথে মিলিত হবে।

উদাহরণস্বরূপ, dataউপরে "কলাম" ওরিয়েন্টে রয়েছে।

data_c = [
 {'A': 5, 'B': 0, 'C': 3, 'D': 3},
 {'A': 7, 'B': 9, 'C': 3, 'D': 5},
 {'A': 2, 'B': 4, 'C': 7, 'D': 6}]

pd.DataFrame.from_dict(data_c, orient='columns')

   A  B  C  D
0  5  0  3  3
1  7  9  3  5
2  2  4  7  6

দ্রষ্টব্য: আপনি যদি ব্যবহার করে থাকেন pd.DataFrame.from_recordsতবে ওরিয়েন্টেশনটি "কলাম" হিসাবে ধরে নেওয়া হবে (আপনি অন্যথায় নির্দিষ্ট করতে পারবেন না) এবং অভিধানগুলি সেই অনুযায়ী লোড হবে।

orient='index'
এই প্রাচ্য সঙ্গে, কীগুলি সূচক মানগুলির সাথে সঙ্গতিপূর্ণ বলে ধরে নেওয়া হয়। এই জাতীয় ডেটা সবচেয়ে উপযুক্ত জন্য উপযুক্ত pd.DataFrame.from_dict

data_i ={
 0: {'A': 5, 'B': 0, 'C': 3, 'D': 3},
 1: {'A': 7, 'B': 9, 'C': 3, 'D': 5},
 2: {'A': 2, 'B': 4, 'C': 7, 'D': 6}}

pd.DataFrame.from_dict(data_i, orient='index')

   A  B  C  D
0  5  0  3  3
1  7  9  3  5
2  2  4  7  6

এই কেসটিকে ওপিতে বিবেচনা করা হয় না, তবে এটি এখনও দরকারী।

কাস্টম সূচক সেট করা হচ্ছে

ফলস্বরূপ ডেটাফ্রেমে আপনার যদি কাস্টম সূচক প্রয়োজন হয় তবে আপনি এটি index=...যুক্তি ব্যবহার করে সেট করতে পারেন ।

pd.DataFrame(data, index=['a', 'b', 'c'])
# pd.DataFrame.from_records(data, index=['a', 'b', 'c'])

   A  B  C  D
a  5  0  3  3
b  7  9  3  5
c  2  4  7  6

এটি দ্বারা সমর্থিত নয় pd.DataFrame.from_dict

হারিয়ে যাওয়া কী / কলামগুলি সহকারে ডিল করা

অনুপস্থিত কী / কলাম মান সহ অভিধান হ্যান্ডেল করার সময় সমস্ত পদ্ধতি বাক্সের বাইরে কাজ করে। উদাহরণ স্বরূপ,

data2 = [
     {'A': 5, 'C': 3, 'D': 3},
     {'A': 7, 'B': 9, 'F': 5},
     {'B': 4, 'C': 7, 'E': 6}]

# The methods below all produce the same output.
pd.DataFrame(data2)
pd.DataFrame.from_dict(data2)
pd.DataFrame.from_records(data2)

     A    B    C    D    E    F
0  5.0  NaN  3.0  3.0  NaN  NaN
1  7.0  9.0  NaN  NaN  NaN  5.0
2  NaN  4.0  7.0  NaN  6.0  NaN

কলামের সাবসেট পড়া

"আমি যদি প্রতিটি একক কলামে পড়তে না চাই তবে কী হবে"? আপনি columns=...প্যারামিটারটি ব্যবহার করে সহজেই এটি নির্দিষ্ট করতে পারেন ।

উদাহরণস্বরূপ, data2উপরের উদাহরণ অভিধান থেকে আপনি যদি কেবল "ক", 'ডি' এবং 'এফ' কলামগুলি পড়তে চান, আপনি একটি তালিকা পাস করে এটি করতে পারেন:

pd.DataFrame(data2, columns=['A', 'D', 'F'])
# pd.DataFrame.from_records(data2, columns=['A', 'D', 'F'])

     A    D    F
0  5.0  3.0  NaN
1  7.0  NaN  5.0
2  NaN  NaN  NaN

এটি pd.DataFrame.from_dictডিফল্ট প্রাচ্য "কলামগুলি" দ্বারা সমর্থিত নয় ।

pd.DataFrame.from_dict(data2, orient='columns', columns=['A', 'B'])

ValueError: cannot use columns parameter with orient='columns'

সারিগুলির উপসেট পড়া

সরাসরি এই পদ্ধতির কোনও দ্বারা সমর্থিত নয় । আপনাকে পুনরাবৃত্তি করার সাথে সাথে আপনাকে আপনার ডেটা নিয়ে পুনরাবৃত্তি করতে হবে এবং জায়গাটিতে একটি বিপরীত মুছে ফেলতে হবে । উদাহরণস্বরূপ, উপরে থেকে কেবল 0 তম এবং 2 তম সারি উত্তোলন data2করতে আপনি ব্যবহার করতে পারেন:

rows_to_select = {0, 2}
for i in reversed(range(len(data2))):
    if i not in rows_to_select:
        del data2[i]

pd.DataFrame(data2)
# pd.DataFrame.from_dict(data2)
# pd.DataFrame.from_records(data2)

     A    B  C    D    E
0  5.0  NaN  3  3.0  NaN
1  NaN  4.0  7  NaN  6.0

প্যানাসিয়া: json_normalizeনেস্টেড ডেটার জন্য

উপরে বর্ণিত পদ্ধতিগুলির একটি শক্তিশালী, শক্তিশালী বিকল্প হ'ল json_normalizeফাংশন যা অভিধানের তালিকা (রেকর্ড) এর সাথে কাজ করে এবং এছাড়াও নেস্টেড অভিধানগুলিও পরিচালনা করতে পারে।

pd.io.json.json_normalize(data)

   A  B  C  D
0  5  0  3  3
1  7  9  3  5
2  2  4  7  6

pd.io.json.json_normalize(data2)

     A    B  C    D    E
0  5.0  NaN  3  3.0  NaN
1  NaN  4.0  7  NaN  6.0

আবার, মনে রাখবেন যে পাস করা ডেটাটি json_normalizeঅভিধানের তালিকা (রেকর্ড) ফর্ম্যাটে থাকা দরকার।

উল্লিখিত হিসাবে, json_normalizeনেস্টেড অভিধানগুলিও পরিচালনা করতে পারে। এখানে ডকুমেন্টেশন থেকে নেওয়া একটি উদাহরণ।

data_nested = [
  {'counties': [{'name': 'Dade', 'population': 12345},
                {'name': 'Broward', 'population': 40000},
                {'name': 'Palm Beach', 'population': 60000}],
   'info': {'governor': 'Rick Scott'},
   'shortname': 'FL',
   'state': 'Florida'},
  {'counties': [{'name': 'Summit', 'population': 1234},
                {'name': 'Cuyahoga', 'population': 1337}],
   'info': {'governor': 'John Kasich'},
   'shortname': 'OH',
   'state': 'Ohio'}
]

pd.io.json.json_normalize(data_nested, 
                          record_path='counties', 
                          meta=['state', 'shortname', ['info', 'governor']])

         name  population    state shortname info.governor
0        Dade       12345  Florida        FL    Rick Scott
1     Broward       40000  Florida        FL    Rick Scott
2  Palm Beach       60000  Florida        FL    Rick Scott
3      Summit        1234     Ohio        OH   John Kasich
4    Cuyahoga        1337     Ohio        OH   John Kasich

যুক্তি metaএবং record_pathতর্কগুলি সম্পর্কে আরও তথ্যের জন্য ডকুমেন্টেশনটি দেখুন।


সংক্ষেপিত

সমর্থিত বৈশিষ্ট্য / কার্যকারিতা সহ উপরে আলোচনা করা সমস্ত পদ্ধতির একটি টেবিল এখানে।

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

* ব্যবহার করুন orient='columns'এবং তারপরে একই প্রভাব পেতে ট্রান্সপোজ করুন orient='index'


8
ওহো! ঠিক আছে এটির সাথে মার্জিং এসও পোস্টের অন্তর্ভুক্ত। আপনি যদি ইতিমধ্যে এটি না করে থাকেন তবে আপনার পান্ডাস ডকুমেন্টেশনে অবদান রাখতে হবে। টেড পেট্রো স্ট্যাক ওভারফ্লোতে পান্ডার জনপ্রিয়তা সম্পর্কে একটি লিঙ্কডইন নিবন্ধ পোস্ট করেছেন এবং উল্লেখ করেছেন যে ভাল ডকুমেন্টেশনের অভাব এখানে প্রশ্নের পরিমাণে অবদান রাখে।
স্কট বোস্টন

2
@ স্কটবস্টন আপনি একেবারে ঠিক বলেছেন, আমি শুনেছি এখন যথেষ্ট সময় হয়েছে যে আমি জানি যে এটি আমার আরও গুরুতর চিন্তা করা উচিত। আমি মনে করি ডকুমেন্টেশন ব্যবহারকারীদের সাহায্য করার দুর্দান্ত উপায় হতে পারে, এমন প্রশ্ন পোস্ট করার চেয়ে বেশি যা কেবল একই শ্রোতার একটি অংশে পৌঁছতে পারে।
cs95

1
এটি দুর্দান্ত উত্তর, আমি মনে করি আমাদের এখনকার
পান্ডাস

3
@ এলি: এটি যাইহোক, এখানে উত্তর না লেখার কোনও কারণ নয় । যে কোনও উত্তর পুরানো হয়ে উঠতে পারে, এটাই আমাদের পক্ষে ভোটদান এবং বিভিন্ন দৃষ্টিভঙ্গি এবং বিভিন্ন লক্ষ্য এখানে বিদ্যমান এবং একই জিনিস ব্যাখ্যা করার বিভিন্ন উপায় থাকা সর্বদা মূল্যবান।
মার্তিজান পিটারস

1
@ মার্তিজজনপিটারগুলি আমি আপনার শেষ দাবির সাথে প্রশ্ন করি এবং একমত নই তবে সামগ্রিকভাবে আমি আপনার সাথে একমত হই। একই প্রশ্নের একই সাথে বিভিন্ন প্রশ্নের উত্তর একসাথে জমা করার জন্য এটি সর্বদা মূল্য সংযোজনকারী নয়, বিশেষত যদি কিছু উত্তর অন্য উত্তরগুলির উপর ভিত্তি করে আপডেট বা শর্তাধীন পার্থক্য থাকে। সবচেয়ে খারাপ ক্ষেত্রে, উত্তরগুলি একত্র হয়ে যাওয়ার সময় ধ্বংসাত্মক হতে পারে (কেবলমাত্র পুরানো উত্তরটিকে আরও সঠিক অবস্থায় সম্পাদনা করার জন্য আরও আপডেট হওয়া উত্তর ব্যবহারের বিপরীতে)। তবে আবারও, আমি আপনার সাথে বেশিরভাগ ক্ষেত্রে একমত।
এলী

83

পান্ডাসে 16.2 এ pd.DataFrame.from_records(d)কাজ করতে আমাকে করতে হয়েছিল ।


1
এই পদ্ধতির ভাল জিনিসটি এটির সাথেও কাজ করেdeque
এমবিজেড

3
পান্ডাস সঙ্গে কাজ করে জরিমানা 0.17.1@joris সমাধান সঙ্গে
আন্তন Protopopov

2
ইউএসিনিগ ০.০৪.১ এবং @জোরিসের সমাধানটি কাজ করে নি তবে এটি করেছে
মিচেন

13
ইন 0.18.1, একটি অবশ্যই ব্যবহার করতে হবে from_recordsযদি অভিধানগুলিতে সবার কাছে একই কী থাকে না।
ফ্রেডক্যালওয়ে

23

আপনি এটি হিসাবে ব্যবহার করতে পারেন pd.DataFrame.from_dict(d):

In [8]: d = [{'points': 50, 'time': '5:00', 'year': 2010}, 
   ...: {'points': 25, 'time': '6:00', 'month': "february"}, 
   ...: {'points':90, 'time': '9:00', 'month': 'january'}, 
   ...: {'points_h1':20, 'month': 'june'}]

In [12]: pd.DataFrame.from_dict(d)
Out[12]: 
      month  points  points_h1  time    year
0       NaN    50.0        NaN  5:00  2010.0
1  february    25.0        NaN  6:00     NaN
2   january    90.0        NaN  9:00     NaN
3      june     NaN       20.0   NaN     NaN

প্রশ্নটি থেকে একটি ডাটা ফ্রেম নির্মাণের সম্পর্কে তালিকা এর dict, এস না একটি একক থেকে dictহিসাবে আপনি আপনার উত্তর বাঁধলাম।
a_guest

@a_guest আপডেট হওয়া উত্তরটি যাচাই করুন। আমি ধরে নিচ্ছি না।
shivsn

2

আমি জানি যে কয়েক জন লোক এদিকে আসবে এবং এখানে কিছুই সাহায্য করবে না। এটি করার সবচেয়ে সহজ উপায়টি আমি এরকম:

dict_count = len(dict_list)
df = pd.DataFrame(dict_list[0], index=[0])
for i in range(1,dict_count-1):
    df = df.append(dict_list[i], ignore_index=True)

আশা করি এটি কাউকে সাহায্য করবে!


1
list=[{'points': 50, 'time': '5:00', 'year': 2010}, 
{'points': 25, 'time': '6:00', 'month': "february"}, 
{'points':90, 'time': '9:00', 'month': 'january'}, 
{'points_h1':20, 'month': 'june'}]

এবং সাধারণ কল:

pd=DataFrame.from_dict(list, orient='columns', dtype=None)

print(pd)

0

পাইটন 3: বেশিরভাগ সমাধান ইতিমধ্যে কাজ করা তালিকাভুক্ত। যাইহোক, এমন উদাহরণ রয়েছে যখন ডেটা ফ্রেমের সারি_সংখ্যার প্রয়োজন হয় না এবং প্রতিটি সারি (রেকর্ড) পৃথকভাবে লিখতে হয়।

নিম্নলিখিত পদ্ধতিটি সে ক্ষেত্রে কার্যকর useful

import csv

my file= 'C:\Users\John\Desktop\export_dataframe.csv'

records_to_save = data2 #used as in the thread. 


colnames = list[records_to_save[0].keys()] 
# remember colnames is a list of all keys. All values are written corresponding
# to the keys and "None" is specified in case of missing value 

with open(myfile, 'w', newline="",encoding="utf-8") as f:
    writer = csv.writer(f)
    writer.writerow(colnames)
    for d in records_to_save:
        writer.writerow([d.get(r, "None") for r in colnames])

0

পান্ডাস ডেটা ফ্রেমে অভিধানের একটি তালিকা রূপান্তর করার জন্য, আপনি "সংযোজন" ব্যবহার করতে পারেন:

আমরা আশা করি আপনি একটি অভিধান নামক dicএবং দান মাথা 30 তালিকার আইটেম আছে ( list1, list2, ..., list30)

  1. পদক্ষেপ 1: আপনার ফলাফল রাখার জন্য একটি পরিবর্তনশীল নির্ধারণ করুন (প্রাক্তন total_df:)
  2. Step2: আরম্ভ total_dfসঙ্গেlist1
  3. স্টিপি 3: সমস্ত তালিকায় যোগ করার জন্য "লুপের জন্য" ব্যবহার করুন total_df
total_df=list1
nums=Series(np.arange(start=2, stop=31))
for num in nums:
    total_df=total_df.append(dic['list'+str(num)])

ওভার সংক্রান্ত তাদের বিস্তারিত দুই বছর বয়সী উত্তর @ cs95 দ্বারা রূপরেখা পন্থা এই পদ্ধতির সুবিধা কি DataFrame(), DataFrame.from_records()এবং .from_dict()?
জেরেমি কেনে

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