来自dataframe.groupby()和max()的意外结果



让我有一个名称,性别及其计数的CSV。

我正在使用groupby()和max()寻找多数名称。但是我从结果中发现了一些奇怪的东西:

CSV:

Name     Gender  Count
Connie   F       90
Connie   F       78
Peter    M       200
Connie   M       5
Connie   F       94
Connie   F       67
John     M       100
Connie   F       73
Connie   F       82
Connie   F       73
May      F       65

代码的第一部分看起来不错:

>>>data = pd.read_csv('names.txt',names=['Name','Gender','Count'])
>>>data = data.groupby(['Name','Gender']).sum().reset_index()
>>>print (data)
     Name Gender  Count
0  Connie      F    557
1  Connie      M      5
2    John      M    100
3     May      F     65
4   Peter      M    200

有两个带有'Connie'的记录,我需要选择大多数。

>>>data= data.groupby(['Name']).max().reset_index()
>>>print(data)
     Name Gender  Count
0  Connie      M    557
1    John      M    100
2     May      F     65
3   Peter      M    200

我做错了什么,以便" connie"的性别是 m 而不是 f ?虽然最大计数是正确的

是正确的,因为M> F,更好的解释在这里。

我也发现了这一点,因此string列不会自动排除滋扰列:

字符串具有 lt()定义的,因此内置的min()和max()在它们上工作。如果非数字对象支持适当的比较方法,则Min()和Max()汇总函数应不含糊。

print (data.groupby(['Name'])['Gender'].max())
Name
Connie    M
John      M
May       F
Peter     M
Name: Gender, dtype: object

对于正确的输出需要idxmax,对于Count列中每个组最大值的索引,然后通过loc选择:

print (data.groupby(['Name'])['Count'].idxmax())
Name
Connie    0
John      2
May       3
Peter     4
Name: Count, dtype: int64
data = data.loc[data.groupby(['Name'])['Count'].idxmax()]
print (data)
     Name Gender  Count
0  Connie      F    557
2    John      M    100
3     May      F     65
4   Peter      M    200

最新更新