Python DataFrame在Groupby两列之后查找最大值并获取计数
我有一个数据帧df,如下所示:Python DataFrame在Groupby两列之后查找最大值并获取计数,python,python-3.x,pandas,dataframe,data-analysis,Python,Python 3.x,Pandas,Dataframe,Data Analysis,我有一个数据帧df,如下所示: userId pageId tag 0 3122471 e852 18 1 3122471 f3e2 18 2 3122471 7e93 18 3 3122471 2768 6 4 3122471 53d9 6 5 3122471 06d7 15 6 3122471 e31c 15 7 3122471 c6f3 2 8 1234123 fjwe 1 9 1234123 e
userId pageId tag
0 3122471 e852 18
1 3122471 f3e2 18
2 3122471 7e93 18
3 3122471 2768 6
4 3122471 53d9 6
5 3122471 06d7 15
6 3122471 e31c 15
7 3122471 c6f3 2
8 1234123 fjwe 1
9 1234123 eiae 4
10 1234123 ieha 4
userId tag
3122471 18
1234123 4
使用df.groupby(['userId','tag'])['pageId'].count()
按userId和tag对数据进行分组后。
我会得到:
userId tag
3122471 2 1
6 2
15 2
18 3
1234123 1 1
4 2
现在我想找到每个用户拥有最多的标签。
如下所示:
userId pageId tag
0 3122471 e852 18
1 3122471 f3e2 18
2 3122471 7e93 18
3 3122471 2768 6
4 3122471 53d9 6
5 3122471 06d7 15
6 3122471 e31c 15
7 3122471 c6f3 2
8 1234123 fjwe 1
9 1234123 eiae 4
10 1234123 ieha 4
userId tag
3122471 18
1234123 4
(注意:如果有多个标记具有相同的计数,我想使用函数
my_rule
来确定要显示哪个标记)按用户ID对原始数据帧进行分组
df.groupby('userId').max()['tag']
或
请注意,第二个解决方案是快两倍的系数
%timeit df.groupby('userId').max()['tag']
# 100 loops, best of 3: 5.69 ms per loop
%timeit df.groupby('userId', as_index=False)['tag'].max()
# 100 loops, best of 3: 2.43 ms per loop
我认为您需要,但首先:
计时:
np.random.seed(123)
N = 100000
df = pd.DataFrame(np.random.randint(1000, size=(N, 3)), columns= ['userId','pageId','tag'])
#print (df)
In [188]: %timeit (df.groupby(['userId', 'tag'], as_index=False)['pageId'].count().groupby('userId').apply(lambda x: x.tag[x.pageId.idxmax()]))
10 loops, best of 3: 180 ms per loop
In [189]: %timeit (df.groupby(['userId', 'tag'])['pageId'].size().reset_index(level='userId').groupby('userId')['pageId'].idxmax())
10 loops, best of 3: 103 ms per loop
VinceP解决方案是错误的,因此不包括计时。您可以处理聚合数据
In [387]: dff = df.groupby(['userId', 'tag'], as_index=False)['pageId'].count()
In [388]: dff
Out[388]:
userId tag pageId
0 1234123 1 1
1 1234123 4 2
2 3122471 2 1
3 3122471 6 2
4 3122471 15 2
5 3122471 18 3
In [389]: dff.groupby('userId').apply(lambda x: x.tag[x.pageId.idxmax()])
Out[389]:
userId
1234123 4
3122471 18
dtype: int64
df.groupby('userId',as_index=False)['tag'].max()
会更好吗?当然,使用大数据集可能会更快。我想知道df.groupby('userId').max()['tag']
和df.groupby('userId',as_index=False)['tag'].max()之间的区别
?前者对除userId
之外的所有列执行max
操作,而后者单独对tag
执行max
操作。我需要知道哪个标记的频率最高。顺便说一句df.groupby(['userId',as_index=False)['tag']。max()
似乎输出了最大的标记id,而不是频率最高的标记?