如何将Pandas DataFrame中的列表列按值匹配转换为多列?
解决方法
可以通过两种简洁的方式实现需求:
方法一:逐行处理生成字典展开
直接对每行的列表进行过滤和映射,生成对应列的键值对后展开为多列:
import pandas as pd import numpy as np # 原数据 df = pd.DataFrame({'column': [[np.nan, np.nan, np.nan], [1, np.nan, np.nan], [2, 3, np.nan], [3, 2, 1]]}) def map_values(lst): # 过滤列表中的NaN值,生成目标列名与值的字典 valid_values = [x for x in lst if not np.isnan(x)] return {f'column_{int(val)}': val for val in valid_values} # 应用函数并转换为DataFrame,补全缺失列并填充NaN result = df['column'].apply(map_values).apply(pd.Series) result = result.reindex(columns=['column_1', 'column_2', 'column_3']).fillna(np.nan) print(result)
运行输出:
column_1 column_2 column_3 0 NaN NaN NaN 1 1.0 NaN NaN 2 NaN 2.0 3.0 3 1.0 2.0 3.0
方法二:利用explode和pivot转换
通过拆分列表、生成列名再透视的方式实现:
import pandas as pd import numpy as np # 原数据 df = pd.DataFrame({'column': [[np.nan, np.nan, np.nan], [1, np.nan, np.nan], [2, 3, np.nan], [3, 2, 1]]}) # 拆分列表并过滤NaN,生成目标列名 df_exploded = df.explode('column').dropna(subset=['column']) df_exploded['col_name'] = 'column_' + df_exploded['column'].astype(int).astype(str) # 透视得到结果,补全缺失列并填充NaN result = df_exploded.pivot(index=df_exploded.index, columns='col_name', values='column') result = result.reindex(columns=['column_1', 'column_2', 'column_3']).fillna(np.nan) print(result)
两种方法均可得到目标结果,第一种适合小数据量的快速处理,第二种在数据量较大时性能更优。
内容的提问来源于stack exchange,提问作者T C Molenaar
相关产品推荐
相关产品推荐

