Pandas将行字段值映射为列表并扩展新列合并到原DataFrame的方法
实现方案
你已经构建好了列值到30维列表的映射字典col的前提下,直接用map+apply+concat的组合就能实现需求,不需要单独为每个列值生成子DataFrame:
单列映射代码示例
import pandas as pd # 替换为你自己的原DataFrame df = pd.DataFrame([[32,23,17,0,3,24,9,14]], columns=['X0','X1','X2','X3','X4','X5','X6','X8']) # 你已构建好的映射字典,注意键的类型要和原表对应列的数值类型一致,这里X8是int类型,所以键用14而非字符串'14' col = { 'X8': { 14: [ 0.06405287, -0.1176078 , -0.06206927, 0.08389127, -0.18036067, 0.35158703, -0.0928449 , -0.0974429 , -0.06705306, -0.17196381, -0.03776502, 0.09204011, 0.47813812, 0.16258538, 0.2699648 , 0.07496626, -0.09791522, -0.31499937, -0.24898018, 0.06126055, 0.13187763, 0.21042736, -0.1585868 , 0.08355565, -0.13935572, 0.12408883, 0.2043313 , -0.12544186, -0.09223691, 0.00720569] } } # 1. 匹配X8列的每个值到对应的30维列表,把列表展开为单独的列 x8_map = df['X8'].map(col['X8']).apply(pd.Series) # 2. 给新列重命名为X8_0 ~ X8_29格式 x8_map.columns = [f'X8_{i}' for i in range(30)] # 3. 按行拼接原DataFrame和新生成的列 result = pd.concat([df, x8_map], axis=1)
多列批量映射代码示例
如果有多个列需要做相同的映射处理,直接循环处理即可:
need_map_cols = ['X8', 'X9', 'X10'] # 替换为你实际要映射的列名 df_parts = [df] for col_name in need_map_cols: tmp = df[col_name].map(col[col_name]).apply(pd.Series) tmp.columns = [f'{col_name}_{i}' for i in range(30)] df_parts.append(tmp) result = pd.concat(df_parts, axis=1)
注意事项
- 映射字典
col中对应列的键的类型,必须和原表对应列的数值类型完全一致,否则会出现匹配失败返回NaN的问题 - 该方案自动按原表行索引对齐,不会出现行顺序错乱的问题,性能远高于循环逐行/逐值生成子DataFrame的实现
内容的提问来源于stack exchange,提问作者Bigboss01
相关产品推荐
相关产品推荐

