我有以下数据框:
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中做到这一点?
答案 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
时间
答案 1 :(得分:0)
像
这样的东西df.resample('D').apply(lambda x: pd.concat(x.values).value_counts().iloc [:2])