use*_*044 3 python dictionary dataframe pandas
我想在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
Run Code Online (Sandbox Code Playgroud)
如果我取消注释第三行代码,则希望产生以下结果。
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
Run Code Online (Sandbox Code Playgroud)
在将此标记为重复之前,我已经看到有关此熊猫错误的其他问题,但似乎没有一个问题可以专门解决此问题。
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
Run Code Online (Sandbox Code Playgroud)
这同样适用于任何结果。请记住,它会[] * n复制引用,因此您会将同一 dict对象分配给多个单元!请牢记这一点。
如果您想避免重复引用,则有另一种方法-您可以使用list comprehension构建列表。
i = {'a' : 1, 'b' : 2}
df.loc[m, 'Col2'] = [i.copy() for _ in range(m.sum())]
Run Code Online (Sandbox Code Playgroud)
如果您有嵌套的字典,则copy仅执行浅表复制,因此请使用copy模块的deepcopy功能:
from copy import deepcopy
df.loc[m, 'Col2'] = [deepcopy(i) for _ in range(m.sum())]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1310 次 |
| 最近记录: |