问题
我想计算两列的唯一组合数。使用pandas实现此目标的最佳方法是什么?
对我来说,最直观的方法是按列分组,然后取对象的长度。然而,对于一个大的数组,我发现性能比下面的第二个变体慢了大约5倍。
# Quick
len1 = lambda: len(df[['a', 'b']].groupby(['a', 'b'], observed=True).nunique())
# Slow
len2 = lambda: len(df[['a', 'b']].groupby(['a', 'b'], observed=True))
字符串
常见问题
1.为什么第二个变量更快?
1.这个计算的最快方法是什么?
MWE复制
import numpy as np
import pandas as pd
import timeit
# Set the number of rows and columns
num_rows = 10000000
num_cols = 5
# Generate random numbers
data = np.random.rand(num_rows, num_cols)
# Convert columns a and b to categorical values
data[:, 0] = pd.Categorical(np.random.randint(0, 10, size=num_rows))
data[:, 1] = pd.Categorical(np.random.randint(0, 10, size=num_rows))
# Create a DataFrame with the random numbers and categorical values
df = pd.DataFrame(data, columns=['a', 'b', 'c', 'd', 'e'])
len1 = lambda: len(df[['a', 'b']].groupby(['a', 'b'], observed=True).nunique())
len2 = lambda: len(df[['a', 'b']].groupby(['a', 'b'], observed=True))
time1 = timeit.timeit(len1, number=10)
print(f"Execution time of len1: {time1:.5f} seconds")
time2 = timeit.timeit(len2, number=10)
print(f"Execution time of len2: {time2:.5f} seconds")
型
输出量:
Execution time of len1: 3.16599 seconds
Execution time of len2: 17.47438 seconds
型
2条答案
按热度按时间yxyvkwin1#
避免
groupby
太慢,我会使用drop_duplicates
:字符串
pqwbnv8z2#
使用
DataFrame.duplicated
和sum
,并使用反转掩码:字符串
或者使用
numpy.unique
:型