我希望在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
非常慢并且数据有点大。
答案 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
列,并获取它们出现的count
和last
日期。
然后按id
,count
,last
对结果数据框进行排序,并在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