私は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
_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以降で動作します。
他のオプション:
z = df['Color'].value_counts
z1 = z.to_dict() #converts to dictionary
df['Count_Column'] = df['Color'].map(z1)
このオプションは、「色」列の各値の頻度に対応する、カウントの繰り返し値を持つ列を提供します。
私の最初の考えは、以下に示すようにリスト内包表記を使用することですが、コメントで指摘したように、これは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
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