56

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

私はそれを次のようにしようとしています:

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

その結果、次のようになります。

ValueError: cannot convert float NaN to integer

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

4

6 に答える 6

74

列にnullが含まれている可能性があります。でドロップできますdf = df.dropna(subset=['item'])。次にdf['item'].value_counts().max()、最大カウントをdf['item'].value_counts().idxmax()提供し、最も頻繁な値を提供する必要があります。

于 2013-02-28T15:43:31.177 に答える
19

@jonathanrocherの回答を続けるには、pandasDataFrameで使用できますmode。行または列全体で最も頻繁な値(1つまたは2つ)を提供します。

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
于 2017-05-11T05:05:00.153 に答える
13

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

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、最初の列と32番目の列で、それぞれ頻度32です。

于 2015-05-05T22:00:49.557 に答える
2

シリーズの最初の行を取るだけ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

于 2019-02-03T13:55:49.293 に答える
1

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

df["item"].value_counts().nlargest(n=1).values[0]
于 2019-06-09T00:22:26.553 に答える
1

周波数の計算では、NaN値は省略されています。 ここでコードの機能を確認してください。 ただし、同じ機能については、以下のコードを使用できます。

**>> Code:**
    # Importing required module
    from collections import Counter

    # Creating a dataframe
    df = pd.DataFrame({ 'A':["jan","jan","jan","mar","mar","feb","jan","dec",
                             "mar","jan","dec"]  }) 
    # Creating a counter object
    count = Counter(df['A'])
    # Calling a method of Counter object(count)
    count.most_common(3)

**>> Output:**

    [('jan', 5), ('mar', 3), ('dec', 2)]
于 2020-05-01T10:37:42.127 に答える