python - 以矢量化方式切片 Pandas 字符串

标签 python pandas

我正在尝试以矢量化方式对字符串进行切片,答案是 NaN。尽管如果序列索引(例如 str[:1])恒定,则工作正常。任何帮助

df = pd.DataFrame({'NAME': ['abc','xyz','hello'], 'SEQ': [1,2,1]}) #
df['SUB'] = df['NAME'].str[:df['SEQ']]

输出为

  NAME  SEQ  SUB
0    abc    1  NaN
1    xyz    2  NaN
2  hello    1  NaN

最佳答案

不幸的是,矢量化解决方案不存在。

使用apply使用 lambda 函数:

df['SUB'] = df.apply(lambda x: x['NAME'][:x['SEQ']], axis=1)

zip列表理解 以获得更好的性能:

df['SUB'] = [x[:y] for x, y in zip(df['NAME'], df['SEQ'])]

print (df)

    NAME  SEQ SUB
0    abc    1   a
1    xyz    2  xy
2  hello    1   h

时间:

df = pd.DataFrame({'NAME': ['abc','xyz','hello'], 'SEQ': [1,2,1]})
df = pd.concat([df] * 1000, ignore_index=True)


In [270]: %timeit df["SUB"] = df.groupby("SEQ").NAME.transform(lambda g: g.str[: g.name])
4.23 ms ± 222 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [271]: %timeit df['SUB'] = df.apply(lambda x: x['NAME'][:x['SEQ']], axis=1)
104 ms ± 2.02 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [272]: %timeit df['SUB'] = [x[:y] for x, y in zip(df['NAME'], df['SEQ'])]
785 µs ± 22.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

关于python - 以矢量化方式切片 Pandas 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50786300/

相关文章:

pandas - 如何根据列的行值分割数据框并以划分的组作为列制作数组?

python - 从 Pandas 数据框中提取单个值

python - 对角化 Pandas 系列

python - 循环遍历行以应用函数 - Python

coding-style - 在线条件表达式或函数 - Pythonic?

python - 初学Python 3--os.path和WinError 2

python - python以什么顺序显示字典键?

Plotly 中的 Python_DF 排序和自定义数据

使用 aiohttp 的 Python lib 美丽的汤

python - 网页抓取错误: Request and No Connection