2 回答
TA贡献1862条经验 获得超6个赞
np.where在这种情况下你可以使用:
df['C'] = np.where(df['A']==1, {'example': 5}, df['C'])
输出:
A B C
0 1 4 {'example': 5}
1 1 5 {'example': 5}
2 1 6 {'example': 5}
3 2 7 NaN
4 2 8 NaN
5 2 9 NaN
由于更新{'example': 5}是一个可迭代的对象,当您将其分配给列时,Pandas 会尝试展开它,因此如果您直接这样做,则会出现长度不匹配错误。要将整个列分配给该字典,您需要将其包装在另一个具有相同长度的迭代中df:
df['C'] = [{'example':5} for _ in df.index]
输出:
A B C
0 1 4 {'example': 5}
1 1 5 {'example': 5}
2 1 6 {'example': 5}
3 2 7 {'example': 5}
4 2 8 {'example': 5}
5 2 9 {'example': 5}
也就是说,除非确实有必要,否则应尽可能避免 Pandas 数据框中的复杂对象。
更新 2:根据 BEN 的评论,也反映在更新中
df['C'] = np.where(df['A']==1, {'example': 5}, df['C'])
可能会将同一对象复制{'example':5}到所有有效行,这可能不是预期的行为。所以对于这样的事情:
df['C'] = [{'example':5} if a==1 else c for a,c in zip(df['A'], df['C'])]
将为各个行创建不同的副本。{'example':5'}
TA贡献1859条经验 获得超6个赞
您可以使用np.where:
df['C'] = np.where(df['A']==1, {'example': 5}, df['C'])
print(df)
印刷:
A B C
0 1 4 {'example': 5}
1 1 5 {'example': 5}
2 1 6 {'example': 5}
3 2 7 None
4 2 8 None
5 2 9 None
添加回答
举报