我有一个包含三列的数据框-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的前两个值。我该怎么办?
我尝试了以下方法:
df_MI3 = df_MI2.groupby('ID').nsmallest(2, 'TYPE')
这给我一个错误。
2。
df_MI3 = df_MI2.groupby('ID').min()
每个"TYPE"
仅给我一个"ID"
答案 0 :(得分:0)
使用cumsum
,cumcount
并将新列创建为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)