Pandas如何新增列并将两列值转为列表,输出records格式字典数组?
Pandas生成行内列表列并转换为records格式字典数组
问题场景
现有如下Pandas DataFrame:
import pandas as pd d = {'a_lower': [1, 2], 'a_upper': [3, 4]} df = pd.DataFrame(data=d)
输出结果:
a_lower a_upper 0 1 3 1 2 4
需求是新增一列a,每行的值为对应行a_lower和a_upper组成的列表,期望结果:
a_lower a_upper a 0 1 3 [1, 3] 1 2 4 [2, 4]
尝试执行df['a'] = [df['a_lower'], df['a_upper']]后得到错误结果:
a_lower a_upper a 0 1 3 0 1\n1 2\nName: a_lower, dtype: int64 1 2 4 0 3\n1 4\nName: a_upper, dtype: int64
错误原因
直接将两个Series组成的列表赋值给新列,会把整个Series对象作为每行的值,而非提取每行对应的两个元素组成列表,导致结果不符合预期。
正确实现方法
以下三种方法均可实现需求:
方法1:使用apply逐行处理
通过apply遍历每一行,将指定列的值组成列表:
df['a'] = df.apply(lambda row: [row['a_lower'], row['a_upper']], axis=1)
方法2:使用zip打包列元素
利用zip将两列的对应元素配对,再转换为列表:
# 生成元组列表,若需要列表类型则额外转换 df['a'] = [list(pair) for pair in zip(df['a_lower'], df['a_upper'])]
方法3:使用agg聚合行元素
通过agg方法对指定列按行聚合为列表:
df['a'] = df[['a_lower', 'a_upper']].agg(list, axis=1)
转换为records格式字典数组
完成列添加后,使用to_dict('records')方法将DataFrame转换为目标格式的字典数组:
result = df.to_dict('records') print(result)
输出结果:
[{'a_lower': 1, 'a_upper': 3, 'a': [1, 3]}, {'a_lower': 2, 'a_upper': 4, 'a': [2, 4]}]
内容的提问来源于stack exchange,提问作者Nikko
相关产品推荐
相关产品推荐

