我已经在python中使用熊猫编写了一个由数字和字符串组成的数据框:
import pandas as pd
import numpy as np
d = {'col1': [1, 5,1,5,1,5,1,5], 'col2': [20,20,40,40,20,20,40,40],\
'col3': np.arange(1,9)*0.1,\
'col4':['Jen','Ross','Chan','Mon','Joe','Phebe','Janice','Gunter']}
df = pd.DataFrame(data=d)
数据框如下:
col1 col2 col3 col4
0 1 20 0.1 Jen
1 5 20 0.2 Ross
2 1 40 0.3 Chan
3 5 40 0.4 Mon
4 1 20 0.5 Joe
5 5 20 0.6 Phoebe
6 1 40 0.7 Janice
7 5 40 0.8 Gunther
使用groupby,我想为(x,y)的每个唯一对找到col3的最小值,其中x属于col1,y属于col2。我还需要知道col4中对应的名称是什么,它导致了这样的分钟。我做到了:
df2=df.groupby(['col1','col2']).min()
print(df2)
我知道了
col1 col2 col3 col4
1 20 0.1 Jen
40 0.3 Chan
5 20 0.2 Phoebe
40 0.4 Gunther
如您所见,最后两行是错误的。查看表中的(5,20)对,最小值为0.2(正确),但显示为罗斯(不适用于Phoebe)。我怎样才能解决这个问题?
答案 0 :(得分:5)
我们可以使用idxmin
来解决
df.loc[df.groupby(['col1','col2'])['col3'].idxmin(),:]
col1 col2 col3 col4
0 1 20 0.1 Jen
2 1 40 0.3 Chan
1 5 20 0.2 Ross
3 5 40 0.4 Mon
或drop_duplicates
df.sort_values(['col3']).drop_duplicates(['col1','col2'])
col1 col2 col3 col4
0 1 20 0.1 Jen
1 5 20 0.2 Ross
2 1 40 0.3 Chan
3 5 40 0.4 Mon
答案 1 :(得分:3)
nsmallest
IMO,请使用WeNYoBen的drop_duplicates
答案。
此答案的优点是可以很容易地概括每个组的n
行数。
pd.concat(d.nsmallest(n=1, columns=['col3']) for _, d in df.groupby(['col1', 'col2']))
col1 col2 col3 col4
0 1 20 0.1 Jen
2 1 40 0.3 Chan
1 5 20 0.2 Ross
3 5 40 0.4 Mon