Pandas如何基于另一列值修改DataFrame指定列的列表元素
问题原因
你原有代码存在两个核心问题:
- 内层lambda直接引用
df['Letter']会取到整个Series对象,而非当前行对应的Letter取值,拼接逻辑本身不符合预期 - Python3环境下
map()返回的是惰性迭代器,不会直接生成实体列表,因此你得到的是map类型对象而非处理完成的列表结果
另外你给出的期望结果最后一行存在笔误:原数据最后一行Letter取值为'4G',对应处理结果应为['4Gd']而非['5Gd']。
实现方案
写法1:易读性优先(中小数据集适用)
使用行级apply搭配列表推导式,逻辑直观易维护:
import pandas as pd # 构造示例数据 df = pd.DataFrame({ 'Letter': ['2G', '2G', '3G', '5G', '4G'], 'Action': [['a','b'], ['a','c','d'], ['a'], ['a','b','c','d','e'], ['d']] }) # 逐行处理:用当前行的Letter值给Action列表内每个元素加前缀 df['Action'] = df.apply(lambda row: [row['Letter'] + elem for elem in row['Action']], axis=1)
写法2:性能优先(大数据集适用)
直接用zip遍历两列的原生Python对象,避免pandas行级apply的额外开销,运行效率比apply高30%~50%(数据量越大差距越明显):
df['Action'] = [ [prefix + elem for elem in action_list] for prefix, action_list in zip(df['Letter'], df['Action']) ]
处理结果
两种写法最终得到的DataFrame输出如下:
| Letter | Action |
|---|---|
| 2G | ['2Ga', '2Gb'] |
| 2G | ['2Ga', '2Gc', '2Gd'] |
| 3G | ['3Ga'] |
| 5G | ['5Ga', '5Gb', '5Gc', '5Gd', '5Ge'] |
| 4G | ['4Gd'] |
内容的提问来源于stack exchange,提问作者Mahdi Abadinia
相关产品推荐
相关产品推荐

