如何使用Pandas行内数组元素生成新列并拆分原行?
如何将DataFrame中每行的对应数组元素配对并展开行?
我来帮你搞定这个需求!你需要把每行里a和b数组的对应元素两两配对成新数组c,同时把原行展开成每个配对对应一行。下面是具体的实现步骤和代码:
第一步:构造原始数据
先重现你给出的DataFrame(修正了原始代码里a列第二个元素的小笔误,和你展示的结果保持一致):
import pandas as pd import numpy as np pa = pd.DataFrame({ 'a': np.array([[1.,4.],[2.,3.3],[3.,4.,5.]]), 'b': np.array([[2.,5.],[3., 6.],[4.,5.,6.]]) })
第二步:生成配对数组并展开行
我们可以用apply逐行处理生成c列,再用explode展开行:
# 逐行将a和b的对应元素配对成列表,存入c列 pa['c'] = pa.apply(lambda row: [list(pair) for pair in zip(row['a'], row['b'])], axis=1) # 把c列的每个配对元素拆分成单独一行,重置索引 result = pa.explode('c', ignore_index=True)
查看最终结果
运行后打印result就能得到你想要的格式:
a b c 0 [1.0, 4.0] [2.0, 5.0] [1.0, 2.0] 1 [1.0, 4.0] [2.0, 5.0] [4.0, 5.0] 2 [2.0, 3.3] [3.0, 6.0] [2.0, 3.0] 3 [2.0, 3.3] [3.0, 6.0] [3.3, 6.0] 4 [3.0, 4.0, 5.0] [4.0, 5.0, 6.0] [3.0, 4.0] 5 [3.0, 4.0, 5.0] [4.0, 5.0, 6.0] [4.0, 5.0] 6 [3.0, 4.0, 5.0] [4.0, 5.0, 6.0] [5.0, 6.0]
简单解释
apply(..., axis=1)让我们可以逐行处理数据,用zip(row['a'], row['b'])把每行a和b的对应元素一一配对,再转成列表形式,这样每行的c就变成了包含所有配对的列表。explode('c')是Pandas专门用来展开列表型列的方法,它会把c列里的每个元素单独拆成一行,同时保留a和b列的原始数组内容,ignore_index=True是为了让新结果的索引从0开始连续排列,更整洁。
内容的提问来源于stack exchange,提问作者TheTank
相关产品推荐
相关产品推荐

