Menciptakan dataframe dari kamus mana entri yang memiliki panjang yang berbeda

Mengatakan saya memiliki sebuah kamus dengan 10 pasangan kunci-nilai. Setiap entri memegang numpy array. Namun, panjang array adalah tidak sama untuk semua dari mereka.

Bagaimana saya dapat membuat dataframe di mana masing-masing kolom memegang masuk yang berbeda?

Ketika saya mencoba:

pd.DataFrame(my_dict)

Saya mendapatkan:

ValueError: arrays must all be the same length

Cara untuk mengatasi hal ini? Saya senang untuk memiliki Panda menggunakan NaN untuk pad kolom tersebut untuk lebih pendek entri.

Larutan

Di Python 3.x:

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

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

Di Python 2.x:

ganti d.item() dengan d.iteritems().

Komentar (11)

Berikut ini's cara yang mudah untuk melakukannya:

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
Komentar (2)

Cara merapikan sintaks anda, tapi tetap pada dasarnya melakukan hal yang sama seperti ini jawaban yang lain, adalah di bawah ini:

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

Serupa sintaks yang ada untuk daftar, terlalu:

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

Sintaks lain untuk daftar:

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

Dalam semua kasus ini, anda harus berhati-hati untuk memeriksa apa yang datatype panda akan kira untuk kolom. Kolom berisi NaN (hilang) nilai-nilai yang akan dikonversi ke lampung, misalnya.

Komentar (0)

Meskipun hal ini tidak langsung menjawab OP's pertanyaan. Saya menemukan ini menjadi solusi yang sangat baik untuk kasus saya, ketika saya sudah tidak seimbang array dan I'd ingin berbagi:

dari panda dokumentasi

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
Komentar (0)

Anda juga dapat menggunakan pd.concat bersama axis=1 daftar pd.Seri benda-benda:

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
Komentar (0)

Kedua baris berikut bekerja dengan sempurna :

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

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

Tapi dengan %waktuhal pada Jupyter, I've punya rasio kecepatan 4x B vs, yang cukup mengesankan, terutama ketika bekerja dengan data yang besar set (terutama dengan besar jumlah kolom/fitur).

Komentar (0)

Jika anda don't ingin menunjukkan NaN dan anda memiliki dua panjang tertentu, menambahkan 'ruang' di setiap sisa sel juga akan bekerja.

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   

Jika anda memiliki lebih dari 2 panjang entri, disarankan untuk membuat fungsi yang menggunakan metode yang sama.

Komentar (0)