将字典设置为dataframe中的值时,Pandas值错误

时间:2017-11-10 21:29:49

标签: python python-2.7 pandas dictionary

我想在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错误的其他问题,但似乎没有人具体解决此问题。

1 个答案:

答案 0 :(得分:5)

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会复制引用,因此您将相同的 dict对象分配给多个单元格!请记住这一点。

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

i = {'a' : 1, 'b' : 2}
j = [i.copy() for _ in range(m.sum())]

df.loc[m, 'Col2'] = j

如果您有嵌套字典,copy只执行浅层复制,请改用copy模块的deepcopy函数:

from copy import deepcopy
j = [deepcopy(i) for _ in range(m.sum())]