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.
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()
.
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
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.
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:
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
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
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).
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.