pandas DataFrame中按另一列指定位置提取字符串列字符的方法
pandas 从字符串列按另一列指定索引提取字符的最优实现
以下为不同场景下的主流实现方案:
方案1:列表推导式(绝大多数场景最优)
代码最简洁,性能远高于行级apply,适合千万行以下的绝大多数数据集:
df["extracted"] = [s[i] for s, i in zip(df["s"], df["i"])]
如果需要处理索引超出字符串长度的边界情况,可扩展为:
df["extracted"] = [s[i] if 0 <= i < len(s) else pd.NA for s, i in zip(df["s"], df["i"])]
方案2:numpy 向量化实现(超大规模数据集最优)
完全向量化操作,在百万行以上的数据集上性能表现最佳:
import numpy as np # 将字符串列转为字符二维数组 char_arr = np.array(df["s"].apply(list).tolist()) # 按行索引和i列的列索引取值 df["extracted"] = char_arr[np.arange(len(df)), df["i"]]
方案3:apply 实现(小数据集可读性最优)
代码可读性最高,但行级apply性能较差,仅适合万级以下的小数据集使用:
df["extracted"] = df.apply(lambda row: row["s"][row["i"]], axis=1)
你尝试的df["s"].str.get()方法仅支持传入固定整数,不支持传入Series动态取每行的不同索引,因此不适用该场景。
结果验证
运行上述任意方案后,输出的df结果如下:
| s | i | extracted | |
|---|---|---|---|
| 0 | ACGT | 0 | A |
| 1 | AAGA | 2 | G |
内容的提问来源于stack exchange,提问作者Uri Laserson
相关产品推荐
相关产品推荐

