Pandas: 在 DataFrame 中存储 dict 失败

创建于 2017-10-04  ·  3评论  ·  资料来源: pandas-dev/pandas

代码示例,如果可能的话,一个可复制粘贴的示例

下面的两个示例都失败并出现相同的错误

df = pd.DataFrame(index=[0, 1, 2], columns=['a', 'b'])

df.loc[0, 'a'] = dict(x=2)
df.iloc[0, 0] = dict(x=2)

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-282-62f3ee5ff885> in <module>()
      1 # file_map.loc[file_no, 'Q_step_length'] = dict(a=1)
      2 df = pd.DataFrame(index=[0, 1, 2], columns=['a', 'b'])
----> 3 df.iloc[0, 0] = dict(x=2)
      4 df['a'] = df['a'].apply(lambda x: x[0] if not pd.isnull(x) else x)
      5 df

...\lib\site-packages\pandas\core\indexing.py in __setitem__(self, key, value)
    177             key = com._apply_if_callable(key, self.obj)
    178         indexer = self._get_setitem_indexer(key)
--> 179         self._setitem_with_indexer(indexer, value)
    180 
    181     def _has_valid_type(self, k, axis):

...\lib\site-packages\pandas\core\indexing.py in _setitem_with_indexer(self, indexer, value)
    603 
    604             if isinstance(value, (ABCSeries, dict)):
--> 605                 value = self._align_series(indexer, Series(value))
    606 
    607             elif isinstance(value, ABCDataFrame):

...\lib\site-packages\pandas\core\indexing.py in _align_series(self, indexer, ser, multiindex_indexer)
    743             return ser.reindex(ax)._values
    744 
--> 745         raise ValueError('Incompatible indexer with Series')
    746 
    747     def _align_frame(self, indexer, df):

ValueError: Incompatible indexer with Series

这有效,但将列表放入数据框中

df[0, 'a'] = [dict(x=2)]

可以通过使用如下非常不优雅的结构直接在数据框中获取字典:

df['a'] = df['a'].apply(lambda x: x[0] if not pd.isnull(x) else x)

问题描述

由于可以将 dict 存储在数据框中,因此尝试上述分配不应失败。 我知道 df.loc[...] = dict(...) 会将 dict 中的值分配给相应的列(如果存在)(是否记录在案?)并且有其自身的问题,但此行为在访问时不适用数据框的单个位置

预期产出

在指定位置内带有 dict 的数据框。

pd.show_versions()的输出

安装版本

提交:无
蟒蛇:3.5.4.final.0
蟒蛇位:64
操作系统:Windows
操作系统版本:10
机器:AMD64
处理器:Intel64 Family 6 Model 58 Stepping 9, GenuineIntel
字节序:很少
LC_ALL:无
朗:无
语言环境:无。无

熊猫:0.20.3
pytest:无
点数:9.0.1
设置工具:36.5.0
赛通:0.26
麻木:1.13.1
scipy:0.19.1
xarray:无
IPython:6.1.0
狮身人面像:无
帕西:0.4.1
日期工具:2.6.1
皮茨:2017.2
块:无
瓶颈:无
表:无
numexpr:无
羽毛:无
matplotlib:2.0.2
openpyxl:无
xlrd:无
xlwt:无
xlsxwriter:无
lxml:无
bs4:无
html5lib: 0.9999999
sqlalchemy:无
pymysql:无
psycopg2:无
神社2:2.9.6
s3fs:无
pandas_gbq:无
pandas_datareader:无

Indexing

最有用的评论

遇到同样的问题,有两个想法:

在 DataFrame 中存储 dict 是不寻常的,但在某些情况下,软件可能会使用 Pandas 作为一种表示和操作任意键/值样式数据的方式,其中数据的索引方式对面板表示有意义。

基于位置的索引将根据提供的字典的键/值更新列的行为令我感到惊讶。 这是一个很酷的便利功能,在未引用显式列时有意义。 例如,当提供:

df.loc[row, :] = dict(key1=value1, key2=value2)

字典的键可以写成列并且df.loc[row, key1] == value1是有道理的。 但是,在提供显式列索引时,从提供的字典中推断目标列(对我而言)是违反直觉的。 如果我改为提供:

df.loc[row, col] = dict(key=value)

我明确表示我想将整个值存储在col列中,并且我希望字典按原样插入。

无论如何,我同意@jreback的观点,这有点不习惯,但我对@andreas-thomik 提出的原始问题表示同情。 我遇到了一个问题,尝试使用这种语法将字典存储到数据帧的元素中对于我面临的特定问题是有意义的,所以他并不完全靠自己来处理这个请求。

所有3条评论

这是非常不习惯的,你在这里几乎是一个人。 你可以通过在它周围使用一个列表/元组来做到这一点

In [14]: df.loc[0, 'a'] = [dict(x=2)]

In [15]: df
Out[15]: 
            a    b
0  [{'x': 2}]  NaN
1         NaN  NaN
2         NaN  NaN

遇到同样的问题,有两个想法:

在 DataFrame 中存储 dict 是不寻常的,但在某些情况下,软件可能会使用 Pandas 作为一种表示和操作任意键/值样式数据的方式,其中数据的索引方式对面板表示有意义。

基于位置的索引将根据提供的字典的键/值更新列的行为令我感到惊讶。 这是一个很酷的便利功能,在未引用显式列时有意义。 例如,当提供:

df.loc[row, :] = dict(key1=value1, key2=value2)

字典的键可以写成列并且df.loc[row, key1] == value1是有道理的。 但是,在提供显式列索引时,从提供的字典中推断目标列(对我而言)是违反直觉的。 如果我改为提供:

df.loc[row, col] = dict(key=value)

我明确表示我想将整个值存储在col列中,并且我希望字典按原样插入。

无论如何,我同意@jreback的观点,这有点不习惯,但我对@andreas-thomik 提出的原始问题表示同情。 我遇到了一个问题,尝试使用这种语法将字典存储到数据帧的元素中对于我面临的特定问题是有意义的,所以他并不完全靠自己来处理这个请求。

@aaclayton这与 #18955 有关。 我们可以/应该更好地支持设置 dicts 的标量(和其他可迭代对象)。 虽然它有点棘手。

此页面是否有帮助?
0 / 5 - 0 等级