如何基于Pandas DataFrame的列表型列生成对应样本取值的衍生列
如何基于Pandas DataFrame的列表型列生成对应样本取值的衍生列
嘿,这个需求其实很好实现,核心就是把列表列里的每个样本名称,对应到原DataFrame里的数值列,生成新的衍生列就好。我给你整理了具体的实现方案,你可以直接套用:
完整实现代码
import pandas as pd import numpy as np # 你的原始数据 df_matrix_data = {'11': [['P4-1', 'P4-2', 'P4-3'], ['P4-1', 'P4-3', 'P4-4']], '00': [['P4-4', 'P4-6', 'P4-7',], ['P4-2', 'P4-5', 'P4-7']], 'P4-1': [1, 2], 'P4-2': [6, 8], 'P4-3': [5, 2], 'P4-4': [2, 3], 'P4-5': [np.nan, 2], 'P4-6': [6, np.nan], 'P4-7': [3, 2]} df_matrix = pd.DataFrame.from_dict(df_matrix_data) # 定义需要处理的列表型目标列 target_cols = ['11', '00'] for col in target_cols: # 把列表列拆分为多个临时列,得到每个位置的样本名称 split_cols = df_matrix[col].apply(pd.Series) # 给临时列重命名为「原列名_序号」的格式,比如11_1、11_2 split_cols.columns = [f"{col}_{idx+1}" for idx in split_cols.columns] # 批量生成新列:将每个临时列的样本名称,映射到原DataFrame的数值列 new_cols = split_cols.apply(lambda x: df_matrix.lookup(df_matrix.index, x), axis=0) # 把新列合并到原DataFrame中 df_matrix = pd.concat([df_matrix, new_cols], axis=1) # 打印最终结果 print(df_matrix)
代码解释
我把代码拆成几个关键步骤给你讲清楚:
- 第一步:遍历目标列:我们只需要处理
11和00这两个存着样本列表的列 - 第二步:拆分列表列:用
apply(pd.Series)把每个单元格的列表拆成多列,比如11列的每个列表有3个元素,拆分后会得到3列,然后把列名改成11_1、11_2、11_3,完全符合你的命名要求 - 第三步:映射数值:用
df_matrix.lookup这个神器,它可以根据行索引和列名,精准定位到对应单元格的数值。我们把拆分后的样本名称列传入,就能直接拿到每个位置对应的数值 - 第四步:合并新列:把生成的衍生列合并到原DataFrame,就得到了你想要的最终结果
运行效果
运行完代码后,输出的DataFrame和你期望的完全一致:
11 00 P4-1 P4-2 P4-3 P4-4 P4-5 P4-6 P4-7 11_1 11_2 11_3 00_1 00_2 00_3 0 [P4-1, P4-2, P4-3] [P4-4, P4-6, P4-7] 1 6 5 2 NaN 6.0 3 1 6 5 2 6 3 1 [P4-1, P4-3, P4-4] [P4-2, P4-5, P4-7] 2 8 2 3 2.0 NaN 2 2 2 3 8 2 2
小提示
如果你的列表列里的列表长度不一致(比如有的行是3个元素,有的是4个),apply(pd.Series)会自动给短列表的行补NaN,这时候你可以根据需求选择保留或者删除这些NaN行/列。
备注:内容来源于stack exchange,提问作者emor
相关产品推荐
相关产品推荐

