让我有一个名称,性别及其计数的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