从条目中具有不同长度的字典创建数据框

Jos*_*osh 91 python pandas

假设我有一个包含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().

  • @dancab我想这就是窍门。字典理解使这变得更加清晰:`pd.DataFrame({k:pd.Series(v) for k,v in d.items()})` (6认同)
  • @germ,您可能想先导入Series或执行类似`pd.Series(...)`的操作(假设在import部分中将“ import pandas as pd`导入”) (3认同)
  • 此答案的更紧凑版本:`pd.DataFrame({k:pd.Series(l)for k,d.items()}中的l)) (3认同)
  • 稍微解释一下就好了。基本上,用 pandas.Series 而不是字典值的数组列表有什么技巧,对吗? (3认同)

小智 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.DataFramepandas.concat

  • 以下代码使用列表理解从不均匀的a 中创建 a listof DataFrames、 with ,然后将 DataFrame 与 组合。 pandas.DataFramedictarraysconcat
    • axis=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.DataFrameitertools.zip_longest

  • 对于长度不均匀的可迭代,zip_longest用 填充缺失值fillvalue
  • zip 生成器需要解压,因为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)


use*_*487 6

虽然这并不能直接回答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)