You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何提取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 19:09:32