【发布时间】:2017-03-04 02:57:50
【问题描述】:
我希望找到数据框列中出现重复值序列的索引。我希望结果是一个列表列表,其中每个子列表都是一个单独的重复值索引序列。
我当前的代码可以工作,但速度很慢(在 10,000 行数据帧中 10% 的重复需要 15 毫秒):
import pandas as pd
import numpy as np
import time
# Given a dataframe and column, return a list of lists where each sublist
# contains indexes of the sequential duplicates
def duplicate_ranges(df, c):
return to_ranges(df[c].shift(1) == df[c])
# Take a pandas Series of booleans and return a list of lists where each
# sub-list is the indexs of sequential true values in the list
def to_ranges(s):
r = []
g = []
for k, v in s.items():
if v == True:
g.append(k)
elif len(g) > 0:
r.append(g)
g = []
if len(g) > 0:
r.append(g)
return r
def bench_it(n):
data = {"A": np.random.randint(10, 10000)}
idxs = pd.date_range(start='2000-01-01', periods=10000)
df = pd.DataFrame(data, index=idxs)
t = time.time()
for _ in range(0, n):
r = duplicate_ranges(df, 'A')
t = time.time() - t
print("{:d} iterations took {:.1f} msec".format(n, 1000*t))
bench_it(1000)
据我所知,所有时间都花在了 to_ranges() 的主循环中。我对 pandas 和 numpy 还很陌生,有人可以提出一种加快速度的方法吗?
【问题讨论】:
-
您的代码示例似乎有问题 -
df在列'A'中将有一个相同的值 -
np.random.randint(10, 10000) 生成 0 到 9 范围内的 10000 个随机整数列表
-
奇怪的是,如果我换行:如果 v == True: 只是:如果 v:,它会加速到大约 8 毫秒。
-
np.random.randint(10, 10000) 没有指定大小。可能是特定于版本的? np.random.randint(10, size=10000) 有效