猿问

Pandas groupby 重叠列表

我有一个这样的数据框


   data

0   1.5

1   1.3

2   1.3

3   1.8

4   1.3

5   1.8

6   1.5

我有一个这样的列表:


indices = [[0, 3, 4], [0, 3], [2, 6, 4], [1, 3, 4, 5]]

我想使用列表列表生成数据框中每个组的总和,所以


group1 = df[0] + df[1] + df[2]

group2 = df[1] + df[2] + df[3]

group3 = df[2] + df[3] + df[4]

group4 = df[3] + df[4] + df[5]

所以我正在寻找类似的东西 df.groupby(indices).sum


我知道这可以使用 for 循环迭代地完成并将总和应用于每个循环,df.iloc[sublist],但我正在寻找一种更快的方法。


长风秋雁
浏览 262回答 1
1回答

慕沐林林

使用列表理解:a = [df.loc[x, 'data'].sum() for x in indices]print (a)[4.6, 3.3, 4.1, 6.2]arr = df['data'].valuesa = [arr[x].sum() for x in indices]print (a)[4.6, 3.3, 4.1, 6.2]解决方案groupby + sum是可能的,但不确定是否有更好的性能:df1 = pd.DataFrame({    'd' : df['data'].values[np.concatenate(indices)],     'g' : np.arange(len(indices)).repeat([len(x) for x in indices])})print (df1)      d  g0   1.5  01   1.8  02   1.3  03   1.5  14   1.8  15   1.3  26   1.5  27   1.3  28   1.3  39   1.8  310  1.3  311  1.8  3print(df1.groupby('g')['d'].sum())g0    4.61    3.32    4.13    6.2Name: d, dtype: float64在小样本数据中测试的性能 - 在实际数据中应该有所不同:In [150]: %timeit [df.loc[x, 'data'].sum() for x in indices]4.84 ms ± 80.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)In [151]: %%timeit     ...: df['data'].values     ...: [arr[x].sum() for x in indices]     ...:      ...: 20.9 µs ± 99.3 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)In [152]: %timeit pd.DataFrame({'d' : df['data'].values[np.concatenate(indices)],'g' : np.arange(len(indices)).repeat([len(x) for x in indices])}).groupby('g')['d'].sum()1.46 ms ± 234 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)关于真实数据In [37]: %timeit [df.iloc[x, 0].sum() for x in indices]158 ms ± 485 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)In [38]: arr = df['data'].values    ...: %timeit \    ...: [arr[x].sum() for x in indices]5.99 ms ± 18 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)In[49]: %timeit pd.DataFrame({'d' : df['last'].values[np.concatenate(sample_indices['train'])],'g' : np.arange(len(sample_indices['train'])).repeat([len(x) for x in sample_indices['train']])}).groupby('g')['d'].sum()   ...: 5.97 ms ± 45.5 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)有趣..两个底部的答案都很快。
随时随地看视频慕课网APP

相关分类

Python
我要回答