Pertanyaan Saya ingin membuat kolom value_counts di pandas dataframe saya


Saya lebih akrab dengan R tetapi saya ingin melihat apakah ada cara untuk melakukan ini di panda. Saya ingin membuat hitungan nilai unik dari salah satu kolom dataframe saya dan kemudian menambahkan kolom baru dengan jumlah tersebut ke bingkai data asli saya. Saya sudah mencoba beberapa hal yang berbeda. Saya membuat seri panda dan kemudian menghitung jumlah dengan metode value_counts. Saya mencoba untuk menggabungkan kembali nilai-nilai ini ke dataframe asli saya, tetapi saya kunci yang ingin saya gabungkan berada di dalam Indeks (ix / loc). Setiap saran atau solusi akan dihargai

Color Value
Red   100
Red   150
Blue  50

dan saya ingin mengembalikan sesuatu seperti

Color Value Counts
Red   100   2
Red   150   2 
Blue  50    1

32
2017-07-17 20:08


asal


Jawaban:


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

Sebagai contoh,

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

Perhatikan itu transform('count') mengabaikan NaNs. Jika Anda ingin menghitung NaN, gunakan transform(len).


Untuk editor anonim: Jika Anda mendapatkan kesalahan saat menggunakan transform('count') mungkin karena versi Pandas Anda terlalu tua. Di atas bekerja dengan panda versi 0.15 atau yang lebih baru.


40
2017-07-17 20:20



Pemikiran awal saya adalah menggunakan pemahaman daftar seperti yang ditunjukkan di bawah tetapi, seperti yang ditunjukkan dalam komentar, ini lebih lambat daripada groupby dan transform metode. Saya akan membiarkan jawaban ini untuk didemonstrasikan APA YANG TIDAK DILAKUKAN:

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]

Metode @ unutbu menjadi rumit untuk DataFrames dengan beberapa kolom yang membuatnya lebih mudah untuk dikodekan. Jika Anda bekerja dengan bingkai data kecil, ini lebih cepat (lihat di bawah), tetapi sebaliknya, Anda harus menggunakannya TIDAK Gunakan ini.

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
2018-05-15 02:29



Satu opsi lain:

    z = df['Color'].value_counts 

    z1 = z.to_dict() #converts to dictionary

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

Pilihan ini akan memberi Anda sebuah kolom dengan nilai-nilai berulang dari jumlah, sesuai dengan frekuensi masing-masing nilai di kolom 'Warna'.


1
2017-07-08 19:02



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

Anda dapat melakukan ini dengan seri apa saja: kelompokkan dengan sendirinya dan hubungi transform('count'):

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

0
2018-06-30 21:50