web-dev-qa-db-ja.com

pandas dataframeにvalue_countsの列を作成したい

私はRにもっと精通していますが、パンダでこれを行う方法があるかどうかを見たかったです。データフレーム列の1つから一意の値のカウントを作成し、それらのカウントを持つ新しい列を元のデータフレームに追加します。私はいくつかの異なることを試しました。 pandasシリーズを作成し、value_countsメソッドでカウントを計算しました。これらの値を元のデータフレームにマージしようとしましたが、マージするキーはIndex( ix/loc)。任意の提案や解決策をいただければ幸いです

Color Value
Red   100
Red   150
Blue  50

そして私は次のようなものを返したかった

Color Value Counts
Red   100   2
Red   150   2 
Blue  50    1
41
user2592989
_df['Counts'] = df.groupby(['Color'])['Value'].transform('count')
_

例えば、

_In [102]: df = pd.DataFrame({'Color': 'Red Red Blue'.split(), 'Value': [100, 150, 50]})

In [103]: df
Out[103]: 
  Color  Value
0   Red    100
1   Red    150
2  Blue     50

In [104]: df['Counts'] = df.groupby(['Color'])['Value'].transform('count')

In [105]: df
Out[105]: 
  Color  Value  Counts
0   Red    100       2
1   Red    150       2
2  Blue     50       1
_

transform('count')はNaNを無視することに注意してください。 NaNをカウントする場合は、transform(len)を使用します。


匿名エディターの場合:transform('count')の使用中にエラーが発生した場合、Pandasのバージョンが古すぎることが原因である可能性があります。上記はpandasバージョン0.15以降で動作します。

50
unutbu

他のオプション:

    z = df['Color'].value_counts 

    z1 = z.to_dict() #converts to dictionary

    df['Count_Column'] = df['Color'].map(z1) 

このオプションは、「色」列の各値の頻度に対応する、カウントの繰り返し値を持つ列を提供します。

7
ZakS

私の最初の考えは、以下に示すようにリスト内包表記を使用することですが、コメントで指摘したように、これはgroupbyおよびtransformメソッドよりも低速です。 やるべきこと:を示すためにこの回答を残します

In [94]: df = pd.DataFrame({'Color': 'Red Red Blue'.split(), 'Value': [100, 150, 50]})
In [95]: df['Counts'] = [sum(df['Color'] == df['Color'][i]) for i in xrange(len(df))]
In [96]: df
Out[100]: 
  Color  Value  Counts
0   Red    100       2
1   Red    150       2
2  Blue     50       1

[3 rows x 3 columns]

@unutbuのメソッドは、これをコード化するのを簡単にするいくつかの列を持つDataFramesに対して複雑になります。小さいデータフレームで作業している場合、これは高速です(以下を参照)が、そうでない場合は[〜#〜] not [〜#〜]を使用する必要があります。

In [97]: %timeit df = pd.DataFrame({'Color': 'Red Red Blue'.split(), 'Value': [100, 150, 50]}); df['Counts'] = df.groupby(['Color']).transform('count')
100 loops, best of 3: 2.87 ms per loop
In [98]: %timeit df = pd.DataFrame({'Color': 'Red Red Blue'.split(), 'Value': [100, 150, 50]}); df['Counts'] = [sum(df['Color'] == df['Color'][i]) for i in xrange(len(df))]
1000 loops, best of 3: 1.03 ms per loop
2

df['Counts'] = df.Color.groupby(df.Color).transform('count')

任意のシリーズでこれを行うことができます:それ自体でグループ化し、transform('count')を呼び出します:

>>> series = pd.Series(['Red', 'Red', 'Blue'])
>>> series.groupby(series).transform('count')
0    2
1    2
2    1
dtype: int64
1
1''