簡體   English   中英

匯總熊貓中數據分組的分組列中的值

[英]summing up the values in a column from groupedby dataframe in pandas

這是我的pandas.DataFrame:

    a  b
0   1  5
1   1  7
2   2  3
3   1  3
4   2  5
5   2  6
6   1  4
7   1  3
8   2  7
9   2  4
10   2  5

我想創建一個新的DataFrame,它將包含按“ a”分組的數據,並包含每個組的最大3個值的總和。

這是我期望的輸出。 組1的'b'的最大3個值是7,5和4,組2的'b'的最大值是7、6和5。

a
1  16
2  18

df.groupby('a')['b'].nlargest(3)

給我這個輸出,

 a    
 1  1     7
    0     5
    6     4
 2  8     7
    5     6
    10    5

  df.groupby('a')['b'].nlargest(3).sum()

給我總計34(16 + 18)。

如何使用pandas.DataFrame獲得預期的輸出?

謝謝!

使用apply是一種方法。

In [41]: df.groupby('a')['b'].apply(lambda x: x.nlargest(3).sum())
Out[41]:
a
1    16
2    18
Name: b, dtype: int64

時機

In [42]: dff = pd.concat([df]*1000).reset_index(drop=True)

In [43]: dff.shape
Out[43]: (11000, 2)

In [44]: %timeit dff.groupby('a')['b'].apply(lambda x: x.nlargest(3).sum())
100 loops, best of 3: 2.44 ms per loop

In [45]: %timeit dff.groupby('a')['b'].nlargest(3).groupby(level='a').sum()
100 loops, best of 3: 3.44 ms per loop

使用雙groupby由第二級- aMultiIndex

s = df.groupby('a')['b'].nlargest(3).groupby(level='a').sum()
print (s)
a
1    16
2    18
Name: b, dtype: int64

但是對我來說更好:

df.groupby('a')['b'].nlargest(3).sum(level=0)

謝謝Nickil Maveli

編輯:如果需要頂部3再次,使用Series.nlargest

df = pd.DataFrame({'a': [1, 1, 2, 3, 2, 2, 1, 3, 4, 3, 4],
                   'b': [5, 7, 3, 3, 5, 6, 4, 3, 7, 4, 5]})

print (df)
    a  b
0   1  5
1   1  7
2   2  3
3   3  3
4   2  5
5   2  6
6   1  4
7   3  3
8   4  7
9   3  4
10  4  5


df = df.groupby('a')['b'].nlargest(3).sum(level=0).nlargest(3)
print (df)
a
1    16
2    14
4    12
Name: b, dtype: int64

時間

np.random.seed(123)
N = 1000000

L2 = np.arange(100)

df = pd.DataFrame({'b':np.random.randint(20, size=N), 
                   'a': np.random.choice(L2, N)})

print (df)

In [22]: %timeit df.groupby('a')['b'].apply(lambda x: x.nlargest(3).sum())
10 loops, best of 3: 125 ms per loop

In [23]: %timeit df.groupby('a')['b'].nlargest(3).groupby(level='a').sum()
10 loops, best of 3: 121 ms per loop

In [29]: %timeit df.groupby('a')['b'].nlargest(3).sum(level=0)
10 loops, best of 3: 121 ms per loop

np.random.seed(123)
N = 1000000

L2 = list('abcdefghijklmno')

df = pd.DataFrame({'b':np.random.randint(20, size=N), 
                   'a': np.random.choice(L2, N)})

print (df)

In [19]: %timeit df.groupby('a')['b'].apply(lambda x: x.nlargest(3).sum())
10 loops, best of 3: 97.9 ms per loop

In [20]: %timeit df.groupby('a')['b'].nlargest(3).groupby(level='a').sum()
10 loops, best of 3: 96.5 ms per loop

In [31]: %timeit df.groupby('a')['b'].nlargest(3).sum(level=0)
10 loops, best of 3: 97.9 ms per loop

np.random.seed(123)
N = 1000000

L2 = list('abcde')

df = pd.DataFrame({'b':np.random.randint(20, size=N), 
                   'a': np.random.choice(L2, N)})

print (df)


In [25]: %timeit df.groupby('a')['b'].apply(lambda x: x.nlargest(3).sum())
10 loops, best of 3: 82 ms per loop

In [26]: %timeit df.groupby('a')['b'].nlargest(3).groupby(level='a').sum()
10 loops, best of 3: 81.9 ms per loop

In [33]: %timeit df.groupby('a')['b'].nlargest(3).sum(level=0)
10 loops, best of 3: 82.5 ms per loop

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM