假设我有一个名称,性别和计数的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 ?而最大计数是正确的
答案 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