假设我有一个包含10个键值对的字典.每个条目都有一个numpy数组.但是,对于所有这些数组,数组的长度并不相同.
如何创建每个列包含不同条目的数据框?
当我尝试:
pd.DataFrame(my_dict)
Run Code Online (Sandbox Code Playgroud)
我明白了:
ValueError: arrays must all be the same length
Run Code Online (Sandbox Code Playgroud)
有什么方法可以解决这个问 我很高兴Pandas使用NaN填充这些列以获得较短的条目.
Jef*_*eff 108
在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
Run Code Online (Sandbox Code Playgroud)
在Python 2.x中:
替换d.items()为d.iteritems().
小智 73
这是一个简单的方法:
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
Run Code Online (Sandbox Code Playgroud)
Ora*_*bet 11
一种整理语法的方法,但仍然与其他答案基本相同,如下所示:
>>> 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
Run Code Online (Sandbox Code Playgroud)
列表也存在类似的语法:
>>> 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
Run Code Online (Sandbox Code Playgroud)
列表的另一种语法是:
>>> 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
Run Code Online (Sandbox Code Playgroud)
在所有这些情况下,您必须小心检查pandas要为您的列猜测的数据类型.例如,包含任何NaN(缺失)值的列将转换为float.
Tre*_*ney 11
pandas.DataFrame和pandas.concatlistof DataFrames、 with ,然后将 DataFrame 与 组合。
pandas.DataFramedictarraysconcataxis=1沿着宽数据帧的列连接,而默认值 ,axis=0沿着长数据帧的索引连接。
df = pd.DataFrame(date)for 表示dict具有相等长度的值arrays。import pandas as pd
# create the dataframe
df = pd.concat([pd.DataFrame(v, columns=[k]) for k, v in data.items()], axis=1)
Run Code Online (Sandbox Code Playgroud)
pandas.DataFrame和itertools.zip_longestzip_longest用 填充缺失值fillvalue。DataFrame构造函数不会解压它。from itertools import zip_longest
# zip all the values together
zl = list(zip_longest(*data.values()))
# create dataframe
df = pd.DataFrame(zl, columns=data.keys())
Run Code Online (Sandbox Code Playgroud)
ax = df.plot(marker='o', figsize=[10, 5])
Run Code Online (Sandbox Code Playgroud)
df结果ax = df.plot(marker='o', figsize=[10, 5])
Run Code Online (Sandbox Code Playgroud)
虽然这并不能直接回答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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
58930 次 |
| 最近记录: |