在另一列上groupby之后查找列值的最大出现次数

2024-09-30 01:37:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个熊猫数据框:

        id                city
 000.tushar@gmail.com   Bangalore
 00078r@gmail.com       Mumbai
0007ayan@gmail.com      Jamshedpur
0007ayan@gmail.com      Jamshedpur
000.tushar@gmail.com    Bangalore
  00078r@gmail.com      Mumbai
  00078r@gmail.com      Vijayawada
  00078r@gmail.com      Vijayawada
  00078r@gmail.com      Vijayawada

我想找出最大出现的城市名称。因此,对于一个给定的身份证,我可以知道-这是他最喜欢的城市:

^{pr2}$

使用groupby id和city可以得到:

         id                   city       count
0  000.tushar@gmail.com       Bangalore    2
1      00078r@gmail.com        Mumbai      2
2      00078r@gmail.com      Vijayawada    3
3    0007ayan@gmail.com      Jamshedpur    2

如何进一步?我相信有人会这么做,但不知道到底是什么会起作用。所以请建议。在

如果某个id对两个或三个城市有相同的计数,我可以返回这些城市中的任何一个。在


Tags: 数据名称comidcitycountgmailgroupby
2条回答

您可以尝试使用^{}^{}进行双groupby。输出是元组的列表(因为MultiIndex),所以使用apply

df = df.groupby(['id','city']).size().groupby(level=0).idxmax()
                              .apply(lambda x: x[1]).reset_index(name='city')

其他解决方案:

^{pr2}$

或者:

df = df.groupby(['id'])['city'].apply(lambda x: x.value_counts().index[0]).reset_index()

print (df)
                     id        city
0  000.tushar@gmail.com   Bangalore
1      00078r@gmail.com  Vijayawada
2    0007ayan@gmail.com  Jamshedpur

recommended方法是groupby('id').apply(your_custom_function),其中您的自定义函数按“city”聚合并返回最大值(或如您所述,多个max值)。我们甚至不必使用.agg('city')

import pandas as pd

def get_top_city(g):
    return g['city'].value_counts().idxmax()    

df = pd.DataFrame.from_records(
         [('000.tushar@gmail.com', 'Bangalore'), ('00078r@gmail.com',     'Mumbai'),
         ('0007ayan@gmail.com',   'Jamshedpur'),('0007ayan@gmail.com',   'Jamshedpur'),
         ('000.tushar@gmail.com', 'Bangalore'), ('00078r@gmail.com',     'Mumbai'),
         ('00078r@gmail.com',     'Vijayawada'),('00078r@gmail.com',     'Vijayawada'),
         ('00078r@gmail.com',     'Vijayawada')],
         columns=['id','city'],
         index=None
     )

topdf = df.groupby('id').apply(get_top_city)

id
000.tushar@gmail.com     Bangalore
00078r@gmail.com        Vijayawada
0007ayan@gmail.com      Jamshedpur

# or topdf.items()/iteritems() if you want as list of (id,city) tuples

[('000.tushar@gmail.com', 'Bangalore'), ('00078r@gmail.com', 'Vijayawada'), ('0007ayan@gmail.com', 'Jamshedpur')]

相关问题 更多 >

    热门问题