熊猫:找到每人最常见的字符串

时间:2018-04-13 16:48:34

标签: python pandas

我希望在animal聚合数据时找到id中最常见的字符串值,如果计数相同,我想选择animal的最后一个值。

   id   animal       date
0   1    dog      2018-01-01
1   1    dog      2018-01-02
2   1    cat      2018-01-03
3   2    cat      2018-01-01
4   3    dog      2018-01-01
5   4   fish      2018-01-01
6   5    dog      2018-01-01
7   5    cat      2018-01-02

输出应该类似于:

   id animal
0  1   dog
1  2   cat
2  3   dog
3  4   fish
4  5   cat

我无法让它正常工作。我尝试使用pd.get_dummies并计算但不看。理想情况下,解决方案将用于构建,矢量化pandas / numpy,即过滤,连接,np.where等,因为groupby.apply非常慢并且数据有点大。

2 个答案:

答案 0 :(得分:0)

您可以使用它定义自定义规则和aggregate

from collections import Counter
def rule(a):
    m = Counter(a)
    max_val = sorted(m.values())[-1]
    return max(a) if m.values().count(max_val) == 1 else a.tail(1).item()

df.groupby("id").aggregate(rule)

输出:

   animal
id  
1   dog
2   cat
3   dog
4   fish
5   cat

答案 1 :(得分:0)

分组id& animal列,并获取它们出现的countlast日期。

然后按idcountlast对结果数据框进行排序,并在id上删除重复值,保留最后一行(由于我们的排序),给最常见的动物,如果有两只动物,最后在表中观察到的动物。最后,摆脱额外的列count& last

columns = ['id', 'animal']

df2 = df.groupby(columns).date.agg(['count', 'last']).reset_index()
df3 = df2.sort_values(['id', 'count', 'last'])
df3.drop_duplicates('id', keep='last')[columns]

# outputs:

   id animal
1   1    dog
2   2    cat
3   3    dog
4   4   fish
5   5    cat