如何提取Pandas列表列中由另一列指定索引的元素?
从Pandas DataFrame的列表列中按指定索引提取元素
我有一个包含两列的Pandas DataFrame:
- col1:列表类型列
- col2:整数列,用于指定要提取并存储到col3的列表元素索引;该列可取值NaN,此时col3对应值也为NaN。
示例输入
import pandas as pd import numpy as np df = pd.DataFrame({ 'col1' : [['A', 'B'], ['C', 'D', 'E'], ['F', 'G']], 'col2' : [0, 2, np.nan] })
期望输出
df_out = pd.DataFrame({ 'col1' : [['A', 'B'], ['C', 'D', 'E'], ['F', 'G']], 'col2' : [0, 2, np.nan], 'col3' : ['A', 'E', np.nan] })
解决方案
方法1:apply + lambda 函数
直接遍历每行,判断索引是否有效后提取元素:
df['col3'] = df.apply(lambda row: row['col1'][int(row['col2'])] if pd.notna(row['col2']) else np.nan, axis=1)
方法2:列表推导式
数据量较小时,这种方式简洁高效:
df['col3'] = [col1[int(idx)] if pd.notna(idx) else np.nan for col1, idx in zip(df['col1'], df['col2'])]
方法3:explode + 合并(严谨性优先)
如果需要避免索引越界风险,或者处理更复杂的列表索引场景,可以先展开列表再匹配:
# 生成带行内索引的展开数据 exploded_df = df.explode('col1').assign(row_idx=lambda x: x.groupby(level=0).cumcount()) # 筛选出索引匹配的行,合并回原表 matched = exploded_df[exploded_df['row_idx'] == exploded_df['col2']][['col1']] df = df.join(matched, how='left').rename(columns={'col1': 'col3'})
执行上述任意一种方法后,df都会变成期望的输出格式。
内容的提问来源于stack exchange,提问作者alex
相关产品推荐
相关产品推荐

