Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python DataFrame在Groupby两列之后查找最大值并获取计数_Python_Python 3.x_Pandas_Dataframe_Data Analysis - Fatal编程技术网

Python DataFrame在Groupby两列之后查找最大值并获取计数

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

我有一个数据帧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  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,而不是频率最高的标记?