Pandas计算gropby中嵌套列表中最常见的元素并获得nlargest

时间:2016-12-29 00:09:38

标签: python pandas

我有以下数据框:

                           animals
2016-12-26 11:03:10        [dog]
2016-12-26 11:03:13        [dog, cat]
2016-12-26 12:03:13        [elephant, cat]
2016-12-26 12:03:13        [cow, dog]
2016-12-27 11:03:10        [cow, dog, cat]
2016-12-27 11:03:13        [elephant]
2016-12-27 12:03:13        [elephant]
2016-12-27 12:03:13        [dog, cat]

我需要得到N个最常见的动物及其按日期计数。 例如(N = 2):

             animal  size
2016-12-26      dog     3
                cat     2
2016-12-27      cat     2
           elephant     2

我怎么能在pandas 0.19.x中做到这一点?

2 个答案:

答案 0 :(得分:4)

选项1

  • apply(pd.Series)将列表嵌入为dataframe的一部分
  • stack进入易于管理的系列
  • reset_index因为堆叠中会留下令人讨厌的神器
  • groupby + pd.TimeGrouper('D') + value_counts + head完成工作
df.animals.apply(pd.Series).stack() \
    .reset_index(1, drop=True) \
    .groupby(pd.TimeGrouper('D')) \
    .apply(lambda x: pd.value_counts(x).head(2))

选项2

  • resample 'D'然后sum合并一天内的所有列表
  • value_counts
  • nlargest
df.animals.resample('D').sum() \
    .apply(pd.value_counts).stack() \
    .groupby(level=0, group_keys=False).nlargest(2)

选项3

  • list理解展平名单
  • numpy.unique获取唯一值及其计数
  • numpy.argsort获得2个最大值计数
  • 每天
  • resample并使用apply
def big2(s):
    l = [i for l in s.values.tolist() for i in l]
    u, c = np.unique(l, return_counts=True)
    a = np.argsort(c)[-2:]
    return pd.Series(c[a], u[a])

df.animals.resample('D').apply(big2)

收益

2016-12-26  dog         3
            cat         2
2016-12-27  elephant    2
            cat         2
dtype: int64

时间

enter image description here

答案 1 :(得分:0)

这样的东西
df.resample('D').apply(lambda x: pd.concat(x.values).value_counts().iloc [:2])