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