4

2 列の pandas データフレームがあります (以下のスニペット)。City 列を使用して自治区を推測しようとしています (置換が必要な Unspecified 値がいくつかあることに気付くでしょう)。これを行うために、私は各都市について最高の発生区を表示し、キーが都市になり、値がその都市の最高発生区になる辞書に出力しようとしています。

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

一見、これは正しい出力のように見えましたが、よく調べてみると、出力はまったく正しくありません。何か案は?

編集:

以下の提案を試してみました: 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 の出力は次のとおりです。

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
4

1 に答える 1

7

これでうまくいくと思います:

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

これにより、City をインデックスとして、最も頻繁に使用される Borough を Borough 列に持つ DataFrame が得られます。

>>> 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 も持っていることをお勧めします。)

于 2012-11-19T02:25:26.653 に答える