如何将 python 对象(如字典)分配给 pandas 列

Posted

技术标签:

【中文标题】如何将 python 对象(如字典)分配给 pandas 列【英文标题】:How to assign a python object (such as a dictionary) to pandas column 【发布时间】:2018-04-24 04:35:38 【问题描述】:

我想在 pandas 数据框中设置一个单元格,该单元格等于一个字典,其中同一行中的另一列等于 1。我正在使用 df.loc 过滤行。因为我的字典有两个键,所以它只有在df.loc 完成的过滤也有两个键时才有效。如果它没有两个键,我会得到ValueError: Must have equal len keys and value when setting with an iterable

我不明白为什么这两件事是相关的。

import pandas as pd
df = pd.DataFrame(data=[[1,2], [0,3], [3,4]], columns=['Col1', 'Col2'])
#df = pd.DataFrame(data=[[1,2], [1,3], [3,4]], columns=['Col1', 'Col2'])

df.loc[df["Col1"]==1, "Col2"] = 'key1': 'A',
                                 'key2': 'B'

print df

如果我取消注释第三行代码,我想产生以下结果。

   Col1                            Col2
0     1  u'key2': u'B', u'key1': u'A'
1     1  u'key2': u'B', u'key1': u'A'
2     3                               4

在它被标记为重复之前,我已经看到了关于这个 pandas 错误的其他问题,但似乎没有一个专门解决这个问题。

【问题讨论】:

当心!您正在复制引用,因此如果您修改一个,则修改所有副本! @coldspeed。没事儿。实际上只有一个df。我的意思是如果我取消注释第二个,那么第一个将被评论。 如果您取消注释第三行代码,我不明白为什么您希望获得该输出。在那种情况下,为什么df.Col1[1] 会等于1 @andrew_reece 我很抱歉。我修复的代码中有一些拼写错误 当我在 Python 2.7.12 上运行你的代码时,它给出了预期的输出而没有错误。 【参考方案1】:

IIUC,将字典包装在一个列表中,并将其传递给loc

df

   Col1  Col2
0     1     2
1     1     3
2     3     4

m = df['Col1'].eq(1)
df.loc[m, 'Col2'] = ['a' : 1, 'b' : 2] * m.sum()

df

   Col1              Col2
0     1  'a': 1, 'b': 2
1     1  'a': 1, 'b': 2
2     3                 4

这应该同样适用于任何结果。请记住,[] * n 复制了引用,因此您将 same dict 对象分配给多个单元格!请记住这一点。

如果您想避免重复引用,还有另一种选择 - 您可以使用 列表理解 构建一个列表。

i = 'a' : 1, 'b' : 2
df.loc[m, 'Col2'] = [i.copy() for _ in range(m.sum())]

如果您有嵌套字典,copy 只执行浅拷贝,因此请改用copy 模块的deepcopy 函数:

from copy import deepcopy
df.loc[m, 'Col2'] = [deepcopy(i) for _ in range(m.sum())]

【讨论】:

这是处理解决方案的一种创造性方式。不过,这似乎是熊猫的一个奇怪功能。我也想存储序列化。

以上是关于如何将 python 对象(如字典)分配给 pandas 列的主要内容,如果未能解决你的问题,请参考以下文章

当我将一个字典分配给另一个变量时,为啥 Python 会同时更新两个字典? [复制]

Python:如何使用字典将运算符的字符串表示形式分配给数学运算符?

将字典分配给类对象

创建一个 Python 函数,该函数将为字符计数的元组创建一个字典,分配给元音、辅音或其他的键

Python-Django 如何将对象列表分配给 M2M?

如何优雅地检查对象/实例/变量的存在,如果它存在于python中,同时将其分配给变量?