【问题标题】:Pandas column search on a Dataframe,, complexity and optimisation for search function on Pandas在 Dataframe 上进行 Pandas 列搜索,Pandas 上搜索功能的复杂性和优化
【发布时间】:2021-12-07 06:47:20
【问题描述】:

在这里,我正在寻找在名为“word”的列上具有给定值的行索引,请注意 df 是一个具有许多列但在“word”列上按字母顺序排序的数据框。
这是我的功能

def getIndex(df,givenword):
    index=df[df['word']==givenword].index.values[0]
    return index

问题是 df 很大(大约 10000k 行),这个函数在 30000 个给定字的循环中调用。搜索性能很糟糕,你能建议一个更好的实现来优化我的功能吗?

【问题讨论】:

  • 请提供更多详细信息、输入和预期输出。根据您的描述,您似乎可以使用 isin
  • @DaniMesejo 输出是行号,输入是数据帧 df。例如 getIndex(dataset,"hello") 将返回行索引 570(这个词的索引)。
  • 是的,但你有 30000 个不同的单词,对吧?而你正在循环它们?
  • @DaniMesejo 是的,我有一个单词列表,从这个列表中我要检查它是否存在并返回索引。所以我循环每个单词

标签: python pandas dataframe numpy dictionary


【解决方案1】:

如果 DataFrame 按字母顺序排序,请使用searchsorted,请参见下面的玩具示例:

import pandas as pd

ser = pd.Series(["fox", "hello", "jump", "world"])
res = ser.searchsorted("jump")
print(res)

输出

2

您甚至可以传递整个单词列表,如下所示:

res = ser.searchsorted(["fox", "hello"])
print(res)

输出

[0 1]

这种方法的时间复杂度是 O(mlogn),其中 m 是要搜索的单词的数量,n 是 DataFrame 的大小。 注意:您需要检查单词是否与索引对应,因为searchsorted搜索需要插入单词的位置。

另一种方法是创建一个字典,将单词映射到第一次出现,然后搜索单词:

lookup = {key: value for key, value in zip(ser.values[::-1], ser.index[::-1])}
words = ["jump", "world"]

res = [lookup[word] for word in words]
print(res)

输出

[2, 3]

这种方法的时间复杂度是 O(n + m)。

【讨论】:

    【解决方案2】:

    我建议idxmax

    def getIndex(df,givenword):
        index = df[df['word'] == givenword].idxmax()
        return index
    

    idxmax 将在此处给出最大值第一次出现的索引,在本例中为True

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-10
      • 2021-02-19
      • 2014-03-01
      • 2020-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多