我有一个pandas数据框:
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
我想找到最大的城市名称。因此,对于给定的身份证,我可以说 - 这是他最喜欢的城市:
id city
000.tushar@gmail.com Bangalore
00078r@gmail.com Vijayawada
0007ayan@gmail.com Jamshedpur
使用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对于两个或三个城市的计数相同,我可以返回任何一个城市。
答案 0 :(得分:5)
您可以尝试使用size
和idxmax
加倍groupby
。输出是元组列表(因为MultiIndex
),因此请使用apply
:
df = df.groupby(['id','city']).size().groupby(level=0).idxmax()
.apply(lambda x: x[1]).reset_index(name='city')
另一种解决方案:
s = df.groupby(['id','city']).size()
df = s.loc[s.groupby(level=0).idxmax()].reset_index().drop(0,axis=1)
或者:
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
答案 1 :(得分:1)
recommended方法为groupby('id').apply(your_custom_function)
,其中your_custom_function通过' city'进行聚合。并返回最大值(或者如您所述,返回多个最大值)。我们甚至不必使用.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')]