Python:パンダデータフレームの2つの列(変数)に基づいて頻度カウントを取得する


92

こんにちは私は次のデータフレームを持っています。

    Group           Size

    Short          Small
    Short          Small
    Moderate       Medium
    Moderate       Small
    Tall           Large

同じ行がデータフレームに表示される頻度をカウントしたいと思います。

    Group           Size      Time

    Short          Small        2
    Moderate       Medium       1 
    Moderate       Small        1
    Tall           Large        1

回答:


144

groupbyを使用できますsize

In [11]: df.groupby(["Group", "Size"]).size()
Out[11]:
Group     Size
Moderate  Medium    1
          Small     1
Short     Small     2
Tall      Large     1
dtype: int64

In [12]: df.groupby(["Group", "Size"]).size().reset_index(name="Time")
Out[12]:
      Group    Size  Time
0  Moderate  Medium     1
1  Moderate   Small     1
2     Short   Small     2
3      Tall   Large     1

7
ありがとう。頻度( "時間")に基づいて上位k(= 20)の値を選択するためのマイナーな追加:df.groupby(["Group"、 "Size"])。size()。reset_index(name = "Time") .sort_values(by = 'Time'、ascending = False).head(20);
Dileep Kumar Patchigolla 2017

1
を使用.size()する.size().reset_index(name="Time")と、DataFrameである間にSeriesが返されることに注意してください。アンディに感謝します。
alemol

または、df.groupby(by=["Group", "Size"], as_index=False).size()簡単に行うこともできます
Naveen Kumar

51

pandas1.1がvalue_counts複数の列を受け入れるようになった後の更新

df.value_counts(["Group", "Size"])

あなたも試すことができます pd.crosstab()

Group           Size

Short          Small
Short          Small
Moderate       Medium
Moderate       Small
Tall           Large

pd.crosstab(df.Group,df.Size)


Size      Large  Medium  Small
Group                         
Moderate      0       1      1
Short         0       0      2
Tall          1       0      0

編集:あなたの出力を得るために

pd.crosstab(df.Group,df.Size).replace(0,np.nan).\
     stack().reset_index().rename(columns={0:'Time'})
Out[591]: 
      Group    Size  Time
0  Moderate  Medium   1.0
1  Moderate   Small   1.0
2     Short   Small   2.0
3      Tall   Large   1.0

7
いいね。追加margins=Trueして周辺カウントを取得することもできます!
マットハンコック

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.