web-dev-qa-db-ja.com

列の最も頻繁な値の数を取得する方法は?

データフレームがあり、特定の列が最も頻繁に値を持っている回数を知りたいです。

私は次の方法でそれをしようとします:

items_counts = df['item'].value_counts()
max_item = items_counts.max()

その結果、私は得る:

ValueError: cannot convert float NaN to integer

私の知る限り、最初の行では、列の値がキーとして使用され、これらの値の頻度が値として使用されるシリーズを取得します。そのため、シリーズの最大値を見つける必要があるだけで、何らかの理由で機能しません。誰もこの問題を解決する方法を知っていますか?

40
Roman

列にヌルが含まれているようです。 df = df.dropna(subset=['item'])でドロップできます。 df['item'].value_counts().max()は最大カウントを提供し、df['item'].value_counts().idxmax()は最も頻繁な値を提供します。

50
beardc

@jonathanrocherの回答を続けるには、 mode in pandas DataFrameを使用できます。行または列:

import pandas as pd
import numpy as np
df = pd.DataFrame({"a": [1,2,2,4,2], "b": [np.nan, np.nan, np.nan, 3, 3]})

In [2]: df.mode()
Out[2]: 
   a    b
0  2  3.0
12

NaNを無視するscipyのmode関数の使用を検討することもできます。それを使用したソリューションは次のようになります。

from scipy.stats import mode
from numpy import nan
df = DataFrame({"a": [1,2,2,4,2], "b": [nan, nan, nan, 3, 3]})
print mode(df)

出力は次のようになります

(array([[ 2.,  3.]]), array([[ 3.,  2.]]))

最も一般的な値は2最初の列と3は秒で、周波数は3および2それぞれ。

11
jonathanrocher

このコード行を追加して、最も頻繁な値を見つけます

df["item"].value_counts().nlargest(n=1).values[0]
1
user9114146

items_countsシリーズの最初の行を取得するだけです:

top = items_counts.head(1)  # or items_counts.iloc[[0]]
value, count = top.index[0], top.iat[0]

これは、 pd.Series.value_counts がデフォルトでsort=Trueを持っているため、既に注文済みカウントで、最高カウントが最初であるため、機能します。位置からインデックスから値を抽出すると、O(1)複雑さを持ちますが、 pd.Series.idxmax はO(n =)複雑さnはカテゴリの数です。

sort=Falseの指定は引き続き可能ですが、idxmaxを推奨します:

items_counts = df['item'].value_counts(sort=False)
top = items_counts.loc[[items_counts.idxmax()]]
value, count = top.index[0], top.iat[0]

この場合、maxidxmaxを別々に呼び出す必要はなく、idxmaxを介してインデックスを抽出し、locラベルベースにフィードする必要があることに注意してください。インデクサー。

1
jpp