如何修改pandas dataframe中存储列表的单元格的值?
报错原因
pandas 使用loc对过滤后的行序列赋值时,会默认将传入的可迭代对象拆分,逐行匹配赋值。你传入的[4,5,6]长度为3,但过滤条件df['x']==1匹配到的行只有1行,长度不匹配,因此抛出对应错误。而at是针对单个单元格赋值的方法,不会做可迭代对象的拆分,所以之前的写入操作可以正常执行。
修复方案
方案1:外层包裹列表适配赋值逻辑
将需要存入单元格的列表再套一层列表,让外层可迭代对象的长度和匹配到的行数一致,pandas 会将内层列表作为单个值写入对应单元格:
df.loc[df['x']==1,'list'] = [[4,5,6]]
如果你的过滤条件可能匹配到N行,只需要把外层列表重复N次即可:
# 示例:匹配到3行,给所有行都存入[4,5,6] df.loc[df['x']>0,'list'] = [[4,5,6]] * len(df[df['x']>0])
方案2:先取索引再用at赋值
如果每次过滤匹配到的只有一行,可以先拿到对应行的索引,再用at执行单个单元格赋值,逻辑更清晰:
# 获取匹配行的索引 match_idx = df[df['x'] == 1].index[0] # 赋值 df.at[match_idx, 'list'] = [4,5,6]
内容的提问来源于stack exchange,提问作者AI92
相关产品推荐
相关产品推荐

