在已有DataFrame中展开Numpy数组为独立列
将DataFrame中的数组列转换为对应多列
需求说明
现有一个包含col 1、col 2、keys、values列的DataFrame,其中keys和values均为NumPy数组类型:
- 每行的
keys内容完全相同 - 每行的
values是对应keys的取值集合
需要将keys中的元素作为新列名,把values的对应值填充到新列中,且直接在原DataFrame上扩展(不新建对象)。
解决方法
方法一:批量转换数组列(高效推荐)
利用pd.DataFrame直接将values列的数组批量转为结构化列,再与原表拼接:
import pandas as pd import numpy as np # 构造源DataFrame source_df = pd.DataFrame( [ ['data', 'data', np.array(['key1', 'key2']), np.array(['value1a', 'value2a'])], ['data', 'data', np.array(['key1', 'key2']), np.array(['value1b', 'value2b'])] ], columns=['col 1', 'col 2', 'keys', 'values'] ) # 提取统一的keys作为新列名,将values列转为DataFrame new_columns = pd.DataFrame(source_df['values'].tolist(), columns=source_df['keys'].iloc[0]) # 拼接原表(删除keys/values列)与新列,覆盖原DataFrame source_df = pd.concat([source_df.drop(['keys', 'values'], axis=1), new_columns], axis=1)
方法二:逐行转换(灵活适配)
通过apply逐行将values数组转为Series,指定索引为对应行的keys:
# 同样基于上述source_df source_df = pd.concat([ source_df.drop(['keys', 'values'], axis=1), source_df.apply(lambda row: pd.Series(row['values'], index=row['keys']), axis=1) ], axis=1)
验证结果
执行上述代码后,source_df的结构和值将与目标goal_df完全一致:
col 1 col 2 key1 key2 0 data data value1a value2a 1 data data value1b value2b
内容的提问来源于stack exchange,提问作者nick
相关产品推荐
相关产品推荐

