Python 如何使用pandas计算一列中每个值在另一列中出现的次数?

Python 如何使用pandas计算一列中每个值在另一列中出现的次数?,python,pandas,group-by,Python,Pandas,Group By,我有一个具有唯一索引和列“用户”、“tweet\u时间”和“tweet\u id”的数据框 我想统计每个用户重复的tweet\u时间值的数量 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-0

我有一个具有唯一索引和列“用户”、“tweet\u时间”和“tweet\u id”的数据框

我想统计每个用户重复的tweet\u时间值的数量

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)
期望输出

A:0

B:1

C:2

我使用下面的代码设法获得所需的输出(A:0除外)。但是有没有一种更具pythonic/效率的方法来做到这一点?

# 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()
#按两列分组
df2=pd.DataFrame(df.groupby(['users','tweet\u times'])。tweet\u id.count()
#过滤掉小于2的值
df3=df2[df2.tweet_id>1]
#将多索引级别1转换为列
df3.重置索引(级别=[1],就地=真)
#最终分组
df3.groupby('users').tweet_times.count()
这很有效

df1=pd.DataFrame(df.groupby(['users'])['tweet\u times'].value\u counts()).reset\u index(level=0)
df1.groupby('users')['tweet_times'].apply(lambda x:sum(x>1))
使用者
A 0
B 1
C2
名称:tweet_times,数据类型:int64

可能有一种更简单的方法,但我现在只能想到以下几点:)

df.groupby(“用户”)[“tweet\u times”].agg(lambda x:x.count()-x.nunique())。重命名(“count\u dupe”)
输出:

users
A    0
B    1
C    2
Name: tweet_times, dtype: int64
用户
A 0
B 1
C2
名称:重复计数,数据类型:int64

您可以将自定义布尔值与您的
groupby
一起使用

当值重复时,
keep=False
返回True,否则返回False

# 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
来创建布尔掩码,然后沿着
轴=1
创建该掩码

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


在我看来,这很像蟒蛇:

df.groupby(“用户”)[“tweet_times”].count()-df.groupby(“用户”)[“tweet_times”].nunique()
输出:

users
A    0
B    1
C    2
Name: tweet_times, dtype: int64

有具体问题吗?你试过什么,做过什么研究吗?请看,。@HenryEcker:你说得对。我已经纠正了这个问题。@AMC:具体的问题是,我没有找到一个资源来解释我如何获得所需的输出,我正在寻找社区的意见。@rrpelgrim我指的是一个具体的技术问题,比如你的具体问题。@HenryEcker:我的错,我已经纠正了。