Pandas:找到每个人最常见的字符串

3

在按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

输出应该类似于:
   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
你可以定义自己的规则并使用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

0
按照 idanimal 列进行分组,并获取它们出现的 countlast 日期。
然后按照 idcountlast 对结果数据框进行排序,并在 id 上删除重复值,保留最后一行。由于我们的排序方式,这将给出最常见的动物,如果有两种动物,则为表中最后观察到的动物。最后,摆脱多余的列 countlast
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

这是最好的解决方案! - Auren Ferguson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接