问题:从条目长度不同的字典创建数据框
假设我有一本包含10个键值对的字典。每个条目包含一个numpy数组。但是,所有数组的长度都不相同。
如何创建每个列包含不同条目的数据框?
当我尝试:
pd.DataFrame(my_dict)我得到:
ValueError: arrays must all be the same length有什么办法可以克服吗?我很高兴Pandas使用NaN这些列来填充较短的条目。
回答 0
在Python 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在Python 2.x中:
替换d.items()为d.iteritems()。
回答 1
这是一种简单的方法:
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回答 2
下面是一种整理语法但仍能与其他答案进行相同操作的方法:
>>> 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
虽然这不能直接回答OP的问题。当我有不相等的数组并且我想分享的时候,我发现这是一个很好的解决方案:
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回答 4
您还可以将其与对象列表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回答 5
以下两行均能完美运行:
pd.DataFrame.from_dict(df, orient='index').transpose() #A
pd.DataFrame(dict([ (k,pd.Series(v)) for k,v in df.items() ])) #B (Better)但是在Jupyter上使用%timeit时,B与A的速度之比为4倍,这在使用庞大的数据集(主要是具有大量列/功能)时尤其令人印象深刻。
回答 6
如果您不想显示它,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个,建议您制作一个使用类似方法的函数。
回答 7
pd.DataFrame([my_dict])会做!
	声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

