我想对每一列的不同值求和我认为我应该使用apply()使用一个特殊的聚合,但是我不知道正确的代码

A  B  C  D  E  F  G
1  2  3  4  5  6  7
1  3  3  4  8  7  7
2  2  3  5  8  1  1
2  1  3  5  7  5  1

#i want to have this result
for each value in column A

A  B  C  D  E   F   G
1  5  3  4  13  13  7
2  3  3  5  15  6   1

最佳答案

可以通过删除每个索引位置的重复项将其矢量化然后可以使用稀疏矩阵方便地重新创建原点矩阵。
您可以完成相同的任务创建一个零数组并添加,但是这样,如果A列非常稀疏,就可以避免大内存需求。

from scipy import sparse

def non_dupe_sums_2D(ids, values):
    v = np.unique(ids)
    x, y = values.shape
    r = np.arange(y)
    m = np.repeat(a, y)
    n = np.tile(r, x)
    u = np.unique(np.column_stack((m, n, values.ravel())), axis=0)
    return sparse.csr_matrix((u[:, 2], (u[:, 0], u[:, 1])))[v].A

a = df.iloc[:, 0].to_numpy()
b = df.iloc[:, 1:].to_numpy()

non_dupe_sums_2D(a, b)

array([[ 5,  3,  4, 13, 13,  7],
       [ 3,  3,  5, 15,  6,  1]], dtype=int64)

性能
df = pd.DataFrame(np.random.randint(1, 100, (100, 100)))

a = df.iloc[:, 0].to_numpy()
b = df.iloc[:, 1:].to_numpy()

%timeit pd.concat([g.apply(lambda x: x.unique().sum()) for v,g in df.groupby(0) ], axis=1)
1.09 s ± 9.19 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit df.iloc[:, 1:].groupby(df.iloc[:, 0]).apply(sum_unique)
1.05 s ± 4.97 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit non_dupe_sums_2D(a, b)
7.95 ms ± 30.9 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

验证
>>> np.array_equal(non_dupe_sums_2D(a, b), df.iloc[:, 1:].groupby(df.iloc[:, 0]).apply(sum_unique).values)
True

关于python - 总结 Pandas 数据框中的不同值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57256172/

10-09 17:08