使用另一列作为索引的 Pandas 子字符串

Posted

技术标签:

【中文标题】使用另一列作为索引的 Pandas 子字符串【英文标题】:Pandas substring using another column as the index 【发布时间】:2019-10-29 12:35:04 【问题描述】:

我正在尝试使用包含起始索引的一列来子选择一个字符串列。

df = pd.DataFrame('string': ['abcdef', 'bcdefg'], 'start_index': [3, 5])
expected = pd.Series(['def', 'g'])

我知道你可以用下面的子串

df['string'].str[3:]

但是,就我而言,开始索引可能会有所不同,所以我尝试了:

df['string'].str[df['start_index']:]

但它返回 NaN。

编辑: 如果我不想使用循环/列表理解怎么办?即首选矢量化方法。

编辑2: 在这个小测试用例中,列表理解似乎更快。

from itertools import islice
%timeit df.apply(lambda x: ''.join(islice(x.string, x.start_index, None)), 1)
%timeit pd.Series([x[y:] for x , y in zip(df.string,df.start_index) ])

631 µs ± 1.96 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
101 µs ± 233 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

【问题讨论】:

所有字符串的长度都一样吗? 不,他们没有。 可以看这里:***.com/questions/39042214/… 【参考方案1】:

使用for循环和两列的zip,为什么我们在这里使用for循环,你可以查看link

[x[y:] for x , y in zip(df.string,df.start_index) ]
Out[328]: ['def', 'g']

【讨论】:

这个解决方案太慢了,对于更大的数据集是不切实际的 @LeszekZarna ***.com/questions/54028199/…

以上是关于使用另一列作为索引的 Pandas 子字符串的主要内容,如果未能解决你的问题,请参考以下文章

pandas - 如果列标题是另一列的子字符串,则创建真/假列

Pandas:如何在第二个 DataFrame 的另一列中查找子字符串位置

pandas:根据另一列中的值获取与相应索引的确切对应值

从pandas DataFrame中另一列中的位置给定的字符串列中提取字符[重复]

Pandas DataFrame:使用列值在另一列中切片字符串

pyspark:删除作为另一列值的子字符串,并从给定列的值中包含正则表达式字符