groupby结果的长度(pandas)

c0vxltue  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(118)

问题

我想计算两列的唯一组合数。使用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

yxyvkwin

yxyvkwin1#

避免groupby太慢,我会使用drop_duplicates

df[['a', 'b']].drop_duplicates().shape[0]

字符串

pqwbnv8z

pqwbnv8z2#

使用DataFrame.duplicatedsum,并使用反转掩码:

out = (~df[['a', 'b']].duplicated()).sum()

字符串
或者使用numpy.unique

out = np.unique(df[['a', 'b']].to_numpy(), axis=0).shape[0]

相关问题