Python Pandas DataFrame:如何在滚动窗口上设置联合聚合
我有一个数据框,其中一列包含ID集,另一列包含日期:Python Pandas DataFrame:如何在滚动窗口上设置联合聚合,python,pandas,set,union,rolling-computation,Python,Pandas,Set,Union,Rolling Computation,我有一个数据框,其中一列包含ID集,另一列包含日期: 将熊猫作为pd导入 df=pd.DataFrame(['2018-01-01',{1,2,3}], ['2018-01-02', {3}], ['2018-01-03', {3, 4, 5}], ['2018-01-04', {5, 6}]], 列=['timestamp','ids']) df['timestamp']=pd.to_datetime(df['timestamp']] df.set_索引('timestamp',inplace
将熊猫作为pd导入
df=pd.DataFrame(['2018-01-01',{1,2,3}],
['2018-01-02', {3}],
['2018-01-03', {3, 4, 5}],
['2018-01-04', {5, 6}]],
列=['timestamp','ids'])
df['timestamp']=pd.to_datetime(df['timestamp']]
df.set_索引('timestamp',inplace=True)
身份证
时间戳
2018-01-01 {1, 2, 3}
2018-01-02 {3}
2018-01-03 {3, 4, 5}
2018-01-04 {5, 6}
我正在寻找的是一个功能,可以给我的ID为过去x天每天。假设x=3,我希望结果是:
ids
时间戳
2018-01-01 {1, 2, 3}
2018-01-02 {1, 2, 3}
2018-01-03 {1, 2, 3, 4, 5}
2018-01-04 {3, 4, 5, 6}
我试过了
df.rolling(3.agg)(set.union)
但这会导致以下错误:
回溯(最近一次呼叫最后一次):
文件“C:\Users\m.manhertz\Envs\demo-8EG6nosu\lib\site packages\pandas\core\window.py”,第222行,在\u prep\u值中
值=\u确保\u浮动64(值)
文件“pandas\\u libs\algos\u common\u helper.pxi”,第3182行,在pandas.\u libs.algos.64中
文件“pandas\\u libs\algos\u common\u helper.pxi”,第3187行,在pandas.\u libs.algos.64中
TypeError:float()参数必须是字符串或数字,而不是“set”
在处理上述异常期间,发生了另一个异常:
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“C:\Users\m.manhertz\Envs\demo-8EG6nosu\lib\site packages\pandas\core\window.py”,第1561行,总计
返回超级(滚动、自)。聚合(arg、*args、**kwargs)
文件“C:\Users\m.manhertz\Envs\demo-8EG6nosu\lib\site packages\pandas\core\window.py”,第321行,总计
返回self.apply(arg,raw=False,args=args,kwargs=kwargs)
文件“C:\Users\m.manhertz\Envs\demo-8EG6nosu\lib\site packages\pandas\core\window.py”,第1580行,在apply中
func,raw=raw,args=args,kwargs=kwargs)
文件“C:\Users\m.manhertz\Envs\demo-8EG6nosu\lib\site packages\pandas\core\window.py”,第1003行,在apply中
中心=假,原始=原始)
文件“C:\Users\m.manhertz\Envs\demo-8EG6nosu\lib\site packages\pandas\core\window.py”,第844行,在应用中
值=自身值(b.值)
文件“C:\Users\m.manhertz\Envs\demo-8EG6nosu\lib\site packages\pandas\core\window.py”,第225行,以_prep_值表示
“”.format(values.dtype))
TypeError:无法处理此类型->对象
Pandas的设计目的不是在pd.Series
对象中保存诸如列表
、集合
、目录
等可编辑项。因此,您的逻辑是不可矢量化的。您的最佳选择可能是列出以下内容:
import pandas as pd
df = pd.DataFrame([['2018-01-01', {1, 2, 3}],
['2018-01-02', {3}],
['2018-01-03', {3, 4, 5}],
['2018-01-04', {3, 6}]],
columns=['timestamp', 'ids'])
df['timestamp'] = pd.to_datetime(df['timestamp'])
df.set_index('timestamp', inplace=True)
df['ids'] = [set.union(*df.iloc[max(0, i-2): i+1, 0]) for i in range(len(df.index))]
print(df)
ids
timestamp
2018-01-01 {1, 2, 3}
2018-01-02 {1, 2, 3}
2018-01-03 {1, 2, 3, 4, 5}
2018-01-04 {3, 4, 5, 6}
嗯,这有点令人失望。尽管如此,这个解决方案还是有效的。您可能需要澄清如何调整列表对x的其他值的理解,例如对于
x=10
,对于范围内的i(len(df.index)),它将是[set.union(*df.iloc[max(0,i-9):i+1,0])