Saya memiliki kerangka data dengan indeks unik dan kolom 'pengguna', 'tweet_time' dan 'tweet_id'.

Saya ingin menghitung jumlah duplikat nilai tweet_time per pengguna.

users = ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C']
tweet_times = ['01-01-01 01:00', '02-02-02 02:00', '03-03-03 03:00', '09-09-09 09:00',
               '04-04-04 04:00', '04-04-04 04:00', '05-05-05 05:00', '09-09-09 09:00',
               '06-06-06 06:00', '06-06-06 06:00', '07-07-07 07:00', '07-07-07 07:00']

d = {'users': users, 'tweet_times': tweet_times} 
df = pd.DataFrame(data=d)

Keluaran yang diinginkan

J: 0

B: 1

C: 2

Saya berhasil mendapatkan output yang diinginkan (kecuali untuk A: 0) menggunakan kode di bawah ini. Tetapi apakah ada cara yang lebih Pythonic/efisien untuk melakukan ini?

# group by both columns
df2 = pd.DataFrame(df.groupby(['users', 'tweet_times']).tweet_id.count())

# filter out values < 2
df3 = df2[df2.tweet_id > 1]

# turn multi-index level 1 into column
df3.reset_index(level=[1], inplace=True)

# final groupby
df3.groupby('users').tweet_times.count()
3
rrpelgrim 11 Mei 2021, 17:44

5 jawaban

Jawaban Terbaik

Kita dapat menggunakan crosstab untuk membuat frekuensi tabel kemudian periksa jumlah yang lebih besar dari 1 untuk membuat topeng boolean lalu sum topeng ini sepanjang axis=1

pd.crosstab(df['users'], df['tweet_times']).gt(1).sum(1)

 users
A    0
B    1
C    2
dtype: int64
4
Shubham Sharma 11 Mei 2021, 15:25

Ini terlihat cukup Pythonic bagi saya:

df.groupby("users")["tweet_times"].count() - df.groupby("users")["tweet_times"].nunique()

Keluaran:

users
A    0
B    1
C    2
Name: tweet_times, dtype: int64
0
Matteo Zanoni 11 Mei 2021, 15:21

Mungkin ada cara yang lebih sederhana, tetapi hanya ini yang bisa saya buat untuk saat ini :)

df.groupby("users")["tweet_times"].agg(lambda x: x.count() - x.nunique()).rename("count_dupe")

Keluaran:

users
A    0
B    1
C    2
Name: count_dupe, dtype: int64
0
AMC 11 Mei 2021, 15:17

Anda dapat menggunakan boolean khusus dengan groupby Anda.

keep=False mengembalikan True ketika nilai diduplikasi dan false jika tidak.

# df['tweet_times'] = pd.to_datetime(df['tweet_times'],errors='coerce')

df.groupby([df.duplicated(subset=['tweet_times'],keep=False),'users']
                                                 ).nunique().loc[True]

       tweet_times
users             
A                0
B                1
C                2
1
Umar.H 11 Mei 2021, 15:19

Ini bekerja,

df1 = pd.DataFrame(df.groupby(['users'])['tweet_times'].value_counts()).reset_index(level = 0)
df1.groupby('users')['tweet_times'].apply(lambda x: sum(x>1))

users
A    0
B    1
C    2
Name: tweet_times, dtype: int64
1
Roach 11 Mei 2021, 15:14