【问题标题】:Group Pandas dataframe based on highest occurring values [duplicate]根据出现的最高值对 Pandas 数据框进行分组
【发布时间】:2012-11-06 23:04:02
【问题描述】:

我有一个带有 2 列的 pandas 数据框(下面的 sn-p)。我正在尝试使用 City 列来推断自治市镇(您会注意到一些需要替换的未指定值)。为此,我试图为每个城市显示出现次数最多的自治市镇,并输出到字典中,其中键是城市,值是该城市出现次数最多的自治市镇。

City        Borough

Brooklyn    Brooklyn
Astoria     Queens
Astoria     Unspecified
Ridgewood   Unspecified
Ridgewood   Queens

因此,如果发现 Ridgewood 与 Queens 配对 100 次、Brooklyn 4 次和Manhattan 1 次,则该配对将是 Ridgewood : Queens。

到目前为止,我已经尝试过这段代码:

specified = data[['Borough','City']][data['Borough']!= 'Unspecified']
paired = specified.Borough.groupby(specified.City).max()

乍一看,这似乎是正确的输出,但仔细检查后,输出根本不正确。有什么想法吗?

编辑:

尝试了以下建议: pairing = 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 的输出,仅供参考:

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

【问题讨论】:

  • max 按字典顺序查找最大的。
  • 啊,这可以解释奇怪的结果......

标签: python pandas


【解决方案1】:

我相信这会做到:

from scipy import stats
d.groupby('City').agg(lambda x: stats.mode(x['Borough'])[0])

这为您提供了一个 DataFrame,其中 City 为索引,Borough 列中出现频率最高的自治市镇:

>>> 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,则必须创建自己的“模式”功能,我想您可以使用 collections.Counter 来完成。但如果您使用的是 pandas,那是一个不错的选择也有 Scipy。)

【讨论】:

  • 这给了我一个断言错误
  • 没关系,我是在你帮助我的另一篇文章中的“指定”集上完成的,它似乎奏效了......
  • 一件奇怪的事情——似乎“曼哈顿”在某些地方被截断了:#[Out]# LONG ISLAND CITY QUEENS #[Out]# MANHATTAAN MANHATTAN #[Out]# MANHATTAN MANHA # [Out]# MASPETH QUEENS #[Out]# MEMPHIS QUEENS #[Out]# MIDDLE VILLAGE QUEENS #[Out]# N/A MANHATTA #[Out]# NEW BRONX #[Out]# NEW HYDE PARK QUEENS #[Out] # NEW YORK MANHA #[Out]# NEW YORK CITY MANHA #[Out]# NEWYORK MANHATTAN
  • @ChrisArmstrong 这对我来说似乎很好......
  • 可能是 iPython 打印问题?今晚我再检查一遍...
猜你喜欢
  • 1970-01-01
  • 2022-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-09
  • 1970-01-01
  • 2017-10-09
相关资源
最近更新 更多