我有一个pandas datafame,其中特定列中的行是id' s。我希望在15分钟内聚合并找到所有这些独特的ID。
timestamp | ids | some_int
00:03:00 {id1, id2, id3} 5
00:10:00 {id2, id4, id7, id10} 9
00:25:00 {id7, id22, id24} 10
00:45:00 {id23, id30} 24
df.resample('15min').agg({'ids': ??, 'some_int': sum)
我在ids列上尝试过总结和其他一些转换,但我还没有完成它。
答案 0 :(得分:1)
将set
更改为list
,然后使用sum
df.ids=df.ids.apply(list)
s=df.resample('15min').agg({'ids': 'sum', 'some_int': 'sum'})
s.loc[s.ids.eq(False),'ids']=''
s.ids=s.ids.apply(set)
s
Out[134]:
ids some_int
timestamp
2018-02-27 00:00:00 {id2, id4, id7, id10, id1, id3} 14
2018-02-27 00:15:00 {id24, id7, id22} 10
2018-02-27 00:30:00 {} 0
2018-02-27 00:45:00 {id23, id30} 24
答案 1 :(得分:0)
这是一种方法。出于某种原因,我无法agg
使用set.union
,因此我执行了2次groupby
操作并加入了它们。
import pandas as pd, numpy as np
from itertools import chain
df = pd.DataFrame([['00:03:00', {'id1', 'id2', 'id3'}, 5],
['00:10:00', {'id2', 'id4', 'id7', 'id10'}, 9],
['00:25:00', {'id7', 'id22', 'id24'}, 10],
['00:45:00', {'id23', 'id30'}, 24]],
columns=['timestamp', 'ids', 'some_int'])
df['timestamp'] = pd.to_datetime(df['timestamp'])
df = df.set_index('timestamp')
x = df.resample('15min')['ids'].apply(chain.from_iterable).map(set).reset_index()
y = df.resample('15min')['some_int'].apply(sum).reset_index()
pd.merge(x, y, how='left')
# timestamp ids some_int
# 0 2018-02-27 00:00:00 {id1, id4, id2, id3, id10, id7} 14
# 1 2018-02-27 00:15:00 {id22, id7, id24} 10
# 2 2018-02-27 00:30:00 {} 0
# 3 2018-02-27 00:45:00 {id30, id23} 24
答案 2 :(得分:0)
您可以使用set.union
,但不能直接在熊猫系列上使用。首先,您必须打开该系列的包装。
df.resample('15min').agg({'ids': lambda s: set.union(*s), 'some_int': sum)