【问题标题】:Find value in one column in another column with regex in pandas在熊猫中使用正则表达式在另一列中的一列中查找值
【发布时间】:2015-09-02 04:23:18
【问题描述】:

我有一个带有两列字符串的 pandas 数据框。我想识别第一列 (s1) 中的字符串出现在第二列 (s2) 中的字符串中的所有行。

如果我的专栏是:

abc    abcd*ef_gh
z1y    xxyyzz

我想保留第一行,而不是第二行。

我能想到的唯一方法是:

  1. 遍历数据框行
  2. 使用s1的内容作为匹配模式将df.str.contains()应用到s2

有没有一种不需要遍历行的方法来完成这项工作?

【问题讨论】:

  • 我认为您目前无法以矢量化方式做到这一点
  • @EdChum 不完全是,可以使用numpy.char.find() 进行简单匹配,如果不涉及re
  • 如果你有一个非常大的数据集,你可以看看Dask

标签: python pandas


【解决方案1】:

用 numpy chararray methods 以矢量化方式可能是可行的(仅用于简单匹配):

In [326]:

print df
    s1          s2
0  abc  abcd*ef_gh
1  z1y      xxyyzz
2  aaa   aaabbbsss
In [327]:

print df.ix[np.char.find(df.s2.values.astype(str), 
                         df.s1.values.astype(str))>=0, 
            's1']
0    abc
2    aaa
Name: s1, dtype: object

【讨论】:

  • 只是为了更新你可以使用df.loc而不是df.ix
【解决方案2】:

我能想到的最好办法是使用 apply 而不是手动迭代:

>> df = pd.DataFrame({'x': ['abc', 'xyz'], 'y': ['1234', '12xyz34']})
>> df
     x        y
0  abc     1234
1  xyz  12xyz34

>> df.x[df.apply(lambda row: row.y.find(row.x) != -1, axis=1)]
1    xyz
Name: x, dtype: object

【讨论】:

  • 很抱歉打扰您,但apply 本质上是一个for 循环,代码看起来更简洁
  • @EdChum 感谢您的确认。 Dask 可能会并行化。
  • 这可能是真的,因为操作彼此独立,因此可以对任务进行分区
猜你喜欢
  • 2021-05-16
  • 2020-09-01
  • 2018-11-08
  • 2016-03-08
  • 1970-01-01
  • 2018-04-11
  • 2021-06-16
  • 2020-11-15
  • 2019-10-19
相关资源
最近更新 更多