এমন অভিধান থেকে ডেটাফ্রেম তৈরি করা যেখানে প্রবেশের বিভিন্ন দৈর্ঘ্য থাকে


114

বলুন আমার কাছে 10 কী-মান জোড়া নিয়ে একটি অভিধান রয়েছে। প্রতিটি এন্ট্রি একটি অদ্ভুত অ্যারে ধারণ করে। তবে অ্যারের দৈর্ঘ্য তাদের সবার জন্য এক নয় same

যেখানে প্রতিটি কলামে আলাদা আলাদা প্রবেশ রয়েছে সেখানে আমি কীভাবে ডেটাফ্রেম তৈরি করতে পারি?

আমি যখন চেষ্টা করি:

pd.DataFrame(my_dict)

আমি পাই:

ValueError: arrays must all be the same length

এ থেকে উত্তরণের কোনও উপায়? NaNসংক্ষিপ্ত এন্ট্রিগুলির জন্য পান্ডারা সেই কলামগুলিকে প্যাড করতে পেরে খুশি ।

উত্তর:


132

পাইথন 3.x এ:

In [6]: d = dict( A = np.array([1,2]), B = np.array([1,2,3,4]) )

In [7]: pd.DataFrame(dict([ (k,pd.Series(v)) for k,v in d.items() ]))
Out[7]: 
    A  B
0   1  1
1   2  2
2 NaN  3
3 NaN  4

পাইথন ২.x এ:

প্রতিস্থাপন d.items()সঙ্গে d.iteritems()


আমি সম্প্রতি এই একই সমস্যা নিয়ে কাজ করছি, এবং এটি আমার যা ছিল তার চেয়ে ভাল! একটি বিষয় লক্ষণীয়, ন্যাএনগুলির সাথে প্যাডিং ধারাবাহিকটি টাইপটিকে ফ্লোট 64 এ বাধ্য করবে, যা আপনাকে পূর্ণসংখ্যার গণিত করার প্রয়োজন হলে সমস্যা হতে পারে।
mattexx

আপনি সর্বদা একটি প্রশ্ন জিজ্ঞাসা করতে পারেন - প্রচুর লোক তাদের উত্তর দেয়
জেফ

মতামতগুলির হিসাবে আপনাকে এমভিসিই সরবরাহ করতে হবে
জেফ

3
@ জর্জ আপনি প্রথমে সিরিজটি আমদানি করতে চান বা এর মতো কিছু করতে চান pd.Series(...) ( import pandas as pdআমদানি বিভাগে ধরে নেওয়া)
নিমা মৌসভী ২

5
এই উত্তরের আরও সংক্ষিপ্ত সংস্করণ:pd.DataFrame({k: pd.Series(l) for k, l in d.items()})
ব্যবহারকারী 55393965

82

এটি করার একটি সহজ উপায় এখানে:

In[20]: my_dict = dict( A = np.array([1,2]), B = np.array([1,2,3,4]) )
In[21]: df = pd.DataFrame.from_dict(my_dict, orient='index')
In[22]: df
Out[22]: 
   0  1   2   3
A  1  2 NaN NaN
B  1  2   3   4
In[23]: df.transpose()
Out[23]: 
    A  B
0   1  1
1   2  2
2 NaN  3
3 NaN  4

'সূচক' এর অন্য বিকল্প আছে কি?
এসগুইনাগা

@ এসুগিনাগা হ্যাঁ: columnsতবে এটি ইতিমধ্যে ডিফল্ট। দেখুন পান্ডাস ডকুমেন্টেশন - pandas.DataFrame.from_dict
Murmel

15

আপনার সিনট্যাক্সটি পরিষ্কার রাখার একটি উপায়, তবে এখনও এই অন্যান্য উত্তরগুলির মতো মূলত একই জিনিস করুন যা নীচে রয়েছে:

>>> mydict = {'one': [1,2,3], 2: [4,5,6,7], 3: 8}

>>> dict_df = pd.DataFrame({ key:pd.Series(value) for key, value in mydict.items() })

>>> dict_df

   one  2    3
0  1.0  4  8.0
1  2.0  5  NaN
2  3.0  6  NaN
3  NaN  7  NaN

তালিকার জন্যও একই ধরণের সিনট্যাক্স উপস্থিত রয়েছে:

>>> mylist = [ [1,2,3], [4,5], 6 ]

>>> list_df = pd.DataFrame([ pd.Series(value) for value in mylist ])

>>> list_df

     0    1    2
0  1.0  2.0  3.0
1  4.0  5.0  NaN
2  6.0  NaN  NaN

তালিকার জন্য অন্য একটি বাক্য গঠন:

>>> mylist = [ [1,2,3], [4,5], 6 ]

>>> list_df = pd.DataFrame({ i:pd.Series(value) for i, value in enumerate(mylist) })

>>> list_df

   0    1    2
0  1  4.0  6.0
1  2  5.0  NaN
2  3  NaN  NaN

আপনাকে অতিরিক্তভাবে ফলাফলটি স্থানান্তর করতে এবং / অথবা কলামের ডেটা টাইপগুলি (ভাসা, পূর্ণসংখ্যা ইত্যাদি) বদলাতে হতে পারে।


3

যদিও এটি ওপি-র প্রশ্নের সরাসরি উত্তর দেয় না। আমার কাছে অসম বিন্যাসের সময় আমি এটি আমার ক্ষেত্রে একটি দুর্দান্ত সমাধান হিসাবে পেয়েছি এবং আমি এটি ভাগ করতে চাই:

পান্ডাস ডকুমেন্টেশন থেকে

In [31]: d = {'one' : Series([1., 2., 3.], index=['a', 'b', 'c']),
   ....:      'two' : Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd'])}
   ....: 

In [32]: df = DataFrame(d)

In [33]: df
Out[33]: 
   one  two
a    1    1
b    2    2
c    3    3
d  NaN    4

3

এছাড়াও আপনি ব্যবহার করতে পারেন pd.concatবরাবর axis=1একটি তালিকা সঙ্গে pd.Seriesবস্তু:

import pandas as pd, numpy as np

d = {'A': np.array([1,2]), 'B': np.array([1,2,3,4])}

res = pd.concat([pd.Series(v, name=k) for k, v in d.items()], axis=1)

print(res)

     A  B
0  1.0  1
1  2.0  2
2  NaN  3
3  NaN  4

2

নিম্নলিখিত দুটি লাইন নিখুঁতভাবে কাজ করে:

pd.DataFrame.from_dict(df, orient='index').transpose() #A

pd.DataFrame(dict([ (k,pd.Series(v)) for k,v in df.items() ])) #B (Better)

তবে জুপিটারে% টাইমাইটের সাথে, আমি বি বনাম এ এর ​​জন্য 4x গতির একটি অনুপাত পেয়েছি, যা বিশেষত বিশাল ডেটা সেট (মূলত বিপুল সংখ্যক কলাম / বৈশিষ্ট্য সহ) নিয়ে কাজ করার সময় কার্যকর হয়।


1

আপনি যদি এটিটি না দেখানোর জন্য চান NaNএবং আপনার দুটি নির্দিষ্ট দৈর্ঘ্য রয়েছে, প্রতিটি অবশিষ্ট কক্ষে একটি 'স্পেস' যুক্ত করাও কাজ করবে।

import pandas

long = [6, 4, 7, 3]
short = [5, 6]

for n in range(len(long) - len(short)):
    short.append(' ')

df = pd.DataFrame({'A':long, 'B':short}]
# Make sure Excel file exists in the working directory
datatoexcel = pd.ExcelWriter('example1.xlsx',engine = 'xlsxwriter')
df.to_excel(datatoexcel,sheet_name = 'Sheet1')
datatoexcel.save()

   A  B
0  6  5
1  4  6
2  7   
3  3   

আপনার যদি 2 টিরও বেশি দৈর্ঘ্যের এন্ট্রি থাকে তবে অনুরূপ পদ্ধতি ব্যবহার করে এমন কোনও ফাংশন তৈরি করার পরামর্শ দেওয়া হচ্ছে।


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