Dataframe上的Pandas列搜索,Pandas上搜索功能的复杂性和优化



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

def getIndex(df,givenword):
index=df[df['word']==givenword].index.values[0]
return index
问题是df相当大的(大约10000k行),这个函数在一个30000给定单词的循环中被调用。搜索性能很糟糕,你能建议一个更好的实现来优化我的功能吗?

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

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)。

我建议idxmax:

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

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

最新更新