【问题标题】:Efficient Way to Slice Strings in Pandas在 Pandas 中切片字符串的有效方法
【发布时间】:2019-10-23 21:28:10
【问题描述】:

我有一个数据集,其中包含超过 1 亿行,我试图在 pandas 中进行操作。我正在尝试根据bc 中的值分别作为起点和终点来分割a 中的字符串。

我可以像这样使用列表理解来做到这一点:

df['d'] = [a[1]['a'][a[1]['b']:a[1]['c']] for a in df.iterrows()]

这真的很慢。我可以用这样的申请做同样的事情:

df['d'] = df.apply(lambda x: x['a'][x['b']:x['c']],axis=1)

这也很慢。我的问题是,使用bc 中的值作为切片的开始和结束,对a 中的字符串进行切片的最有效方法是什么?

【问题讨论】:

  • 这个有点难过。您可能可以使用开始和结束索引沿着 groupby 的路线走,并在每个组上工作,但是 pandas 中的许多 str 方法真的很慢,所以我不确定它是否会比 @ 更好987654332@。你尝试过这样的事情吗?
  • 条件是什么?
  • @user3280146 ?他们只需要使用给定的索引对字符串进行切片。我想说这个问题很清楚。
  • 它表示基于 b 和 c 的值。这是否意味着从“a”列开始,切片应该是 b 列和 c 列中的值之一。示例输出会更容易理解...
  • 你说它很慢。 100 万行需要多少时间?我试图了解“慢”有多慢。它将帮助我们加快速度并比较发布的任何解决方案,因为人们大多无法访问 1 亿行数据。

标签: python pandas dataframe text-processing


【解决方案1】:

迭代df.iterrows() 真的很慢,因为它为每一行创建一个单独的pd.Series 对象。对于 1 亿行,这意味着正在创建(和丢弃)1 亿个此类对象。最好 zip 列并在这样的理解中使用它:

df.assign(d=[a[b:c] for a, b, c in zip(df['a'], df['b'], df['c'])])

这只会创建三个Series 对象,然后对其进行迭代,从而节省大量开销。

您还可以查看Numba 来编写您自己的循环数据框的函数。

【讨论】:

  • 嗯...哇!这将我的过程缩短到 4 秒。我尝试了很多不同的东西,但离那个速度还差得很远。
猜你喜欢
  • 2019-05-08
  • 2022-12-18
  • 2020-12-27
  • 2018-08-13
  • 2020-11-27
  • 2017-10-08
  • 2011-05-24
  • 2021-02-12
  • 2021-04-25
相关资源
最近更新 更多