Pandas:找到每个人最常见的绳子

2024-05-17 04:36:42 发布

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

当按id聚合数据时,我想在animal中找到最常见的字符串值,如果计数相同,我将选择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

输出应该类似于:

^{pr2}$

我没能让它正常工作。我试着用pd.get_dummies和计数,但不看。理想情况下,该解决方案将在构建中使用矢量化的pandas/numpy,即过滤、连接,np.哪里,等等,因为groupby.apply非常慢,并且数据有点大。在


Tags: 数据字符串idgetdate情况catpd
2条回答

您可以定义自定义规则并使用它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)

输出:

^{pr2}$

id&;animal列分组,得到它们出现的count和{}日期。在

然后按idcountlast对结果数据帧进行排序,并在{}上删除重复值,保留最后一行,由于我们的排序,最后一行将给出最常见的动物,如果有两个动物,则为表中最后观察到的动物。最后,去掉多余的列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

相关问题 更多 >