私の最初の考えは、以下に示すようにリスト内包表記を使用することですが、コメントで指摘されているように、これはgroupby
andtransform
メソッドよりも遅くなります。何をしてはいけないかを示すために、この回答を残します。
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 のメソッドは、いくつかの列を持つ DataFrame では複雑になり、コーディングが簡単になります。小さなデータ フレームで作業している場合、これはより高速ですが (以下を参照)、それ以外の場合は使用しないでください。
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