如何在groupby函数上应用nsmallest

时间:2019-05-03 13:26:43

标签: python

我有一个包含三列的数据框-ID, Name, Type

我已使用以下代码使用ID和Type对数据帧进行了排序     df_MI2 = df_MI1.sort_values(by=['ID', 'TYPE'])

所以,现在我有一个像这样的数据框。

+--------+--------+-------+
|ID      |Name    |Type   |
|12      |A       |1      |
|12      |A       |2      |
|12      |A       |3      |
|12      |A       |4      |
|13      |B       |2      |
|13      |B       |4      |
|14      |C       |4      |
|15      |D       |3      |
|15      |D       |4      |
|15      |D       |5      |
|16      |D       |6      |
+--------+--------+-------+

现在,我只想为每个ID选择Type的前两个值。我该怎么办?

我尝试了以下方法:

  1. df_MI3 = df_MI2.groupby('ID').nsmallest(2, 'TYPE')

这给我一个错误。

2。     df_MI3 = df_MI2.groupby('ID').min() 每个"TYPE"仅给我一个"ID"

2 个答案:

答案 0 :(得分:0)

使用cumsumcumcount并将新列创建为increment

然后将所有行放在increment > 2处。

请在下面找到示例

import pandas as pd
import numpy as np

d = {'ID' : ['I2', 'I2', 'I2', 'I2', 'I3', 'I3', 'I4', 'I5', 'I5', 'I5', 'I6'],
        'Name': ['A', 'A', 'A', 'A', 'B', 'B', 'C', 'D', 'D', 'D', 'D'],
        'Type': [1,2,3,4,2,4,4,3,4,5,6]}
df = pd.DataFrame(d)
m=df['ID']
b = m.cumsum()
df['increment'] = np.where(m, df.groupby(m.ne(m.shift()).cumsum()).cumcount()+1, 0)
df = df[df['increment'] < 3]
df.drop('increment', 1, inplace=True)
print(df)

输出为

    ID Name  Type
0   I2    A     1
1   I2    A     2
4   I3    B     2
5   I3    B     4
6   I4    C     4
7   I5    D     3
8   I5    D     4
10  I6    D     6
[Finished in 1.2s]

答案 1 :(得分:0)

我只是简单地通过使用

获得了解决方案
df_MI3 = df_MI2.groupby('ID').head(2)