データフレームがあり、特定の列が最も頻繁に値を持っている回数を知りたいです。
私は次の方法でそれをしようとします:
items_counts = df['item'].value_counts()
max_item = items_counts.max()
その結果、私は得る:
ValueError: cannot convert float NaN to integer
私の知る限り、最初の行では、列の値がキーとして使用され、これらの値の頻度が値として使用されるシリーズを取得します。そのため、シリーズの最大値を見つける必要があるだけで、何らかの理由で機能しません。誰もこの問題を解決する方法を知っていますか?
列にヌルが含まれているようです。 df = df.dropna(subset=['item'])
でドロップできます。 df['item'].value_counts().max()
は最大カウントを提供し、df['item'].value_counts().idxmax()
は最も頻繁な値を提供します。
@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
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
それぞれ。
このコード行を追加して、最も頻繁な値を見つけます
df["item"].value_counts().nlargest(n=1).values[0]
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]
この場合、max
とidxmax
を別々に呼び出す必要はなく、idxmax
を介してインデックスを抽出し、loc
ラベルベースにフィードする必要があることに注意してください。インデクサー。