如何将带有计数的数据框重新采样到新列中并将列聚合到列表中
How to resample dataframe with counts into new column and aggregate column into list
我有一个具有以下形式的测量值的 DataFrame:
label
2015-01-17 20:58:00.740000 cc
2015-01-19 04:36:00.740000 xy
2015-01-19 09:48:00.740000 ab
2015-01-19 09:52:00.740000 ab
2015-01-20 11:45:00.740000 ab
并希望按天对其重新采样,创建一个包含计数的新列并将标签聚合到一个列表中。这样我就有了以下结果:
counts label
2015-01-17 1 [cc]
2015-01-18 0 []
2015-01-19 3 [ab, xy]
2015-01-20 1 [ab]
我是 pandas 的新手,不知道该怎么做。我读过 DataFrame
支持列表作为列类型。我可以通过 DataFrame.resample()
和 sum
来计算天数,我可以将标签放入一个字符串中。但这还不足以产生结果。
我已经用
生成了数据
from datetime import datetime, timedelta
from pandas import DataFrame, TimeGrouper
from random import randint, choice
n = 5
rnd_time = lambda: datetime.now() + timedelta(days=randint(0, 3), hours=randint(0, 24))
rnd_label = lambda: choice(['ab', 'cc', 'xyz'])
gen_times = [rnd_time() for _ in range(n)]
gen_labels = [rnd_label() for _ in range(n)]
df = DataFrame({'label': gen_labels}, index=gen_times)
那么怎样才能达到预期的效果呢?
提前谢谢你。
你可以这样做:
>>> df['counts'] = df.groupby(level=0).transform('count')
>>> df.resample('D', how={'counts': lambda x: x[0] if len(x) else 0,
'label' : lambda x: list(set(x))})
count label
2015-01-17 1 [cc]
2015-01-18 0 []
2015-01-19 3 [xy, ab]
2015-01-20 1 [ab]
编辑:如果元素的顺序很重要,则将 list(set(x))
替换为 list(OrderedDict.fromkeys(x))
。
我有一个具有以下形式的测量值的 DataFrame:
label
2015-01-17 20:58:00.740000 cc
2015-01-19 04:36:00.740000 xy
2015-01-19 09:48:00.740000 ab
2015-01-19 09:52:00.740000 ab
2015-01-20 11:45:00.740000 ab
并希望按天对其重新采样,创建一个包含计数的新列并将标签聚合到一个列表中。这样我就有了以下结果:
counts label
2015-01-17 1 [cc]
2015-01-18 0 []
2015-01-19 3 [ab, xy]
2015-01-20 1 [ab]
我是 pandas 的新手,不知道该怎么做。我读过 DataFrame
支持列表作为列类型。我可以通过 DataFrame.resample()
和 sum
来计算天数,我可以将标签放入一个字符串中。但这还不足以产生结果。
我已经用
生成了数据from datetime import datetime, timedelta
from pandas import DataFrame, TimeGrouper
from random import randint, choice
n = 5
rnd_time = lambda: datetime.now() + timedelta(days=randint(0, 3), hours=randint(0, 24))
rnd_label = lambda: choice(['ab', 'cc', 'xyz'])
gen_times = [rnd_time() for _ in range(n)]
gen_labels = [rnd_label() for _ in range(n)]
df = DataFrame({'label': gen_labels}, index=gen_times)
那么怎样才能达到预期的效果呢?
提前谢谢你。
你可以这样做:
>>> df['counts'] = df.groupby(level=0).transform('count')
>>> df.resample('D', how={'counts': lambda x: x[0] if len(x) else 0,
'label' : lambda x: list(set(x))})
count label
2015-01-17 1 [cc]
2015-01-18 0 []
2015-01-19 3 [xy, ab]
2015-01-20 1 [ab]
编辑:如果元素的顺序很重要,则将 list(set(x))
替换为 list(OrderedDict.fromkeys(x))
。