如何基于条件为Pandas列填充列表值?解决赋值报错问题
解决方案:Pandas按条件为列填充列表类型值
报错原因
你遇到的ValueError: Must have equal len keys and value when setting with an iterable,是因为用loc给匹配到的行赋值列表时,Pandas会默认将列表的每个元素对应到匹配行的每个位置。但你的每个条件只匹配1行,而列表长度为2,两者长度不匹配,因此触发错误。
可行方案
方案1:使用at精准赋值(适合单条匹配的场景)
at用于定位单个元素位置并赋值,不会像loc那样尝试拆分可迭代对象:
U=[2,3] S=[1,3] R=[1,2] test = pd.DataFrame({'a': [1, 2, 3]}) # 定位到匹配行的索引,用at赋值列表 test.at[test.loc[test.a == 1].index[0], 'U'] = U test.at[test.loc[test.a == 2].index[0], 'U'] = S test.at[test.loc[test.a == 3].index[0], 'U'] = R
方案2:字典映射+map(简洁高效,推荐)
先构造a列值到目标列表的映射关系,再用map批量赋值:
U=[2,3] S=[1,3] R=[1,2] test = pd.DataFrame({'a': [1, 2, 3]}) list_map = {1: U, 2: S, 3: R} test['U'] = test['a'].map(list_map)
方案3:使用lambda+apply(和map逻辑类似)
通过apply传入lambda函数,根据a列的值返回对应的列表:
U=[2,3] S=[1,3] R=[1,2] test = pd.DataFrame({'a': [1, 2, 3]}) list_map = {1: U, 2: S, 3: R} test['U'] = test['a'].apply(lambda x: list_map[x])
执行任意一种方案后,test的U列都会正确填充列表值,输出结果如下:
a U 0 1 [2, 3] 1 2 [1, 3] 2 3 [1, 2]
内容的提问来源于stack exchange,提问作者PCMitchell
相关产品推荐
相关产品推荐

