查找Pandas数据框中最常见的事件

时间:2017-04-26 07:41:46

标签: python pandas

我们假设我有一个数据框,我希望将用户与国家/地区相关联:

>>> dfUsers[['userId', 'country', 'lat']].dropna().groupby(['userId', 'country']).agg(len).reset_index()

                 userId      country  lat
0   1479705782818706665        India    1
1   1480576924651623757        India   12
2   1480576924651623757           РФ    2
3   1480928137574356334     Malaysia   17
4   1480988896538924406        India    1
5   1481723517601846740     Malaysia    2
6   1481810347655435765    Singapore    3
7   1481818704328005112    Singapore    6
8   1482457537889441352    Singapore   18
9   1482488858703566411    Singapore    1
10  1482730123382756957        India    1
11  1483106342385227382    Singapore    2
12  1483316566673069712     Malaysia    4
13  1484507758001657608    Singapore    6
14  1484654275131873053    Singapore    1
15  1484666213119301417    Singapore    1
16  1484734631705057076     Malaysia    4

我想要做的是将用户国家相关联。在这种情况下,很容易看到用户1480576924651623757有两个与他/她相关联的不同国家/地区。但是,我想将此用户与India相关联,因为用户在印度的频率高于他/她在其他国家/地区的用户...

有这样一种巧妙的方法吗?我总是可以遍历'userId'并找到与较大的值相对应的值。但是,我想知道是否有办法在没有循环的情况下这样做......

1 个答案:

答案 0 :(得分:1)

似乎您需要idxmax才能按列lat查找每个组的最大索引,然后按loc选择:

df = df.loc[df.groupby('userId')['lat'].idxmax()]
print (df)
                 userId    country  lat
0   1479705782818706665      India    1
1   1480576924651623757      India   12 < 12 is max, so India
3   1480928137574356334   Malaysia   17
4   1480988896538924406      India    1
5   1481723517601846740   Malaysia    2
6   1481810347655435765  Singapore    3
7   1481818704328005112  Singapore    6
8   1482457537889441352  Singapore   18
9   1482488858703566411  Singapore    1
10  1482730123382756957      India    1
11  1483106342385227382  Singapore    2
12  1483316566673069712   Malaysia    4
13  1484507758001657608  Singapore    6
14  1484654275131873053  Singapore    1
15  1484666213119301417  Singapore    1
16  1484734631705057076   Malaysia    4
df = dfUsers[['userId', 'country', 'lat']].dropna()
                                          .groupby(['userId', 'country'])
                                          .size()
                                          .reset_index(name='Count')

df = df.loc[df.groupby('userId')['Count'].idxmax()]