76

Pandas データフレーム列の 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
4

6 に答える 6

3

私の最初の考えは、以下に示すようにリスト内包表記を使用することですが、コメントで指摘されているように、これはgroupbyandtransformメソッドよりも遅くなります。何をしてはいけないかを示すために、この回答を残します。

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
于 2015-05-15T02:29:42.980 に答える