DataFrame.groupby()和max()的意外结果

时间:2017-12-01 07:31:29

标签: python pandas dataframe

假设我有一个名称,性别和计数的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

“康妮”有两条记录,我需要选择大部分记录。

>>>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

我做错了什么,以便'康妮'的性别 M 而不是 F ?而最大计数是正确的

1 个答案:

答案 0 :(得分:1)

这是正确的,因为M> F,更好的解释是here

我也找到this,因此automatic exclusion of nuisance columns不会忽略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

对于Count列中每组最大值索引的正确输出需要idxmax,然后按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