Python 根据出现的最高值对数据帧进行分组

Python 根据出现的最高值对数据帧进行分组,python,pandas,Python,Pandas,我有一个包含两列的熊猫数据框架(下面的代码片段)。我试图使用City列来推断自治区(您会注意到一些未指定的值需要替换)。为此,我尝试为每个城市显示出现频率最高的自治区,并输出到字典,其中键为城市,值为该城市出现频率最高的自治区 City Borough Brooklyn Brooklyn Astoria Queens Astoria Unspecified Ridgewood Unspecified Ridgewood Queens 因此,如果里奇

我有一个包含两列的熊猫数据框架(下面的代码片段)。我试图使用City列来推断自治区(您会注意到一些未指定的值需要替换)。为此,我尝试为每个城市显示出现频率最高的自治区,并输出到字典,其中键为城市,值为该城市出现频率最高的自治区

City        Borough

Brooklyn    Brooklyn
Astoria     Queens
Astoria     Unspecified
Ridgewood   Unspecified
Ridgewood   Queens
因此,如果里奇伍德被发现与皇后区配对100次,布鲁克林4次,曼哈顿1次,那么这对搭档就是里奇伍德:皇后区

到目前为止,我已经尝试了以下代码:

specified = data[['Borough','City']][data['Borough']!= 'Unspecified']
paired = specified.Borough.groupby(specified.City).max()
乍一看,这似乎是正确的输出,但仔细检查后,输出根本不正确。有什么想法吗

编辑:

尝试以下建议: paired=specified.groupby('City').agg(lambda x:stats.mode(x['Borough'])[0])

我注意到一些行政区被截断,如下所示:

paired.Borough.value_counts()

#[Out]# QUEENS           58
#[Out]# MANHATTAN         7
#[Out]# STATEN ISLAND     4
#[Out]# BRONX             4
#[Out]# BROOKLYN          3
#[Out]# MANHATTA          2
#[Out]# STATE             1
#[Out]# QUEEN             1
#[Out]# MANHA             1
#[Out]# BROOK             1
当然,我可以手动替换被截断的单词,但我很想知道原因是什么

PS-以下是DF指定FYI的输出:

specified
#[Out]# <class 'pandas.core.frame.DataFrame'>
#[Out]# Int64Index: 719644 entries, 1 to 396225
#[Out]# Data columns:
#[Out]# Borough    719644  non-null values
#[Out]# City       651617  non-null values
#[Out]# dtypes: object(2)

specified.Borough.value_counts()
#[Out]# QUEENS           215382
#[Out]# BROOKLYN         208565
#[Out]# MANHATTAN        150016
#[Out]# BRONX             94648
#[Out]# STATEN ISLAND     51033
指定
#[Out]#
#[Out]#int64索引:719644个条目,1到396225
#[Out]#数据列:
#[Out]#自治区719644非空值
#[输出]#城市651617非空值
#[Out]#数据类型:对象(2)
指定的.Borough.value_计数()
#[外]#皇后区215382
#[外]#布鲁克林208565
#[Out]#曼哈顿150016
#[Out]#布朗克斯94648
#[Out]#斯塔顿岛51033

我相信这可以做到:

from scipy import stats
d.groupby('City').agg(lambda x: stats.mode(x['Borough'])[0])
这将为您提供一个数据框架,其中城市作为索引,并且是“自治区”列中最常见的自治区:

>>> d
         City      Borough
0    Brooklyn     Brooklyn
1     Astoria       Queens
2     Astoria       Queens
3     Astoria     Brooklyn
4     Astoria  Unspecified
5   Ridgewood  Unspecified
6   Ridgewood       Queens
7   Ridgewood       Queens
8   Ridgewood     Brooklyn
9   Ridgewood     Brooklyn
10  Ridgewood     Brooklyn
>>> d.groupby('City').agg(lambda x: stats.mode(x['Borough'])[0])
             Borough
City               
Astoria      Queens
Brooklyn   Brooklyn
Ridgewood  Brooklyn

(如果你没有安装scipy,你必须创建自己的“模式”功能,我想你可以使用
集合。计数器
。但是如果你使用pandas,你最好也安装scipy。)

这给了我一个断言errornevermind,我是在你帮我写的另一篇文章中的“指定”场景中做的,它似乎起了作用……奇怪的是,《曼哈顿》似乎在某些地方被截断了:#[Out]#长岛市皇后区#[Out]#曼哈顿曼哈顿曼哈顿#[Out]#曼哈顿曼哈顿曼哈顿曼哈顿#[Out]#马斯佩斯皇后区、孟菲斯皇后区、中村皇后区、曼哈顿区、纽约市曼哈顿区#纽约MANHATTAN@ChrisArmstrong这对我来说似乎很好…也许是iPython的印刷问题?今晚我会再检查一遍…
max
按字典顺序找到了最大的。啊,这就解释了奇怪的结果。。。