如何交织Pandas Series中存储的NumPy数组并生成DataFrame?
问题描述
我有一个多层索引的Pandas Series,结构如下:
ID metric_name variant_name ID-1 ordertype1 variant ([0.01, 0.02, 0.... ordertype2 variant ([0.09, 0.10, 0.... dtype: object
单独查看元素时,每个元素都是包含两个numpy数组的元组:
- 对于
result.loc[('ID-1', 'ordertype1', 'variant')],结果是:
(array([0.01, 0.02, 0.03, 0.04]), array([0.05, 0.06, 0.07, 0.08]))
- 对于
result.loc[('ID-1', 'ordertype2', 'variant')],结果是:
(array([0.09, 0.10, 0.11, 0.12]), array([0.13, 0.14, 0.15, 0.16]))
需要提取这些数组的值,将每组的第一个数组和第二个数组分别交织(即先取ordertype1的第一个元素,再取ordertype2的第一个元素,接着ordertype1的第二个元素,以此类推),最终存入DataFrame的两列中,期望结果如下:
Column1 Column2 0.01 0.05 0.09 0.13 0.02 0.06 0.10 0.14 0.03 0.07 0.11 0.15 0.04 0.08 0.12 0.16
解决方案
直接通过以下代码即可实现需求:
import pandas as pd import numpy as np # 假设你的Series名为result # 1. 从每个元组中拆分出两列对应的数组集合 col1_arrays = result.apply(lambda x: x[0]) col2_arrays = result.apply(lambda x: x[1]) # 2. 将数组展开并按位置交织排列 # 先把每个数组转成Series按列拼接,再堆叠实现交织 stacked_col1 = pd.concat([pd.Series(arr) for arr in col1_arrays], axis=1).stack().reset_index(drop=True) stacked_col2 = pd.concat([pd.Series(arr) for arr in col2_arrays], axis=1).stack().reset_index(drop=True) # 3. 合并为目标DataFrame final_df = pd.DataFrame({'Column1': stacked_col1, 'Column2': stacked_col2})
代码说明:
apply(lambda x: x[0]):从每个元组中提取对应Column1的数组,同理x[1]提取Column2的数组;pd.concat(..., axis=1):把不同ordertype的数组按列拼接,此时每一行对应所有ordertype的同位置元素;.stack():将列索引转为行索引,自动实现“先第一个ordertype的第n个元素,再第二个ordertype的第n个元素”的交织排列;- 最后重置索引并合并两列,得到符合要求的结果。
如果后续有更多ordertype,这段代码无需修改即可适配。
内容的提问来源于stack exchange,提问作者DunkinDont
相关产品推荐
相关产品推荐

