Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 根据所选窗口进行数据帧聚合_Python_Pandas_Dataframe - Fatal编程技术网

Python 根据所选窗口进行数据帧聚合

Python 根据所选窗口进行数据帧聚合,python,pandas,dataframe,Python,Pandas,Dataframe,我正在使用python和panda数据帧。 我有一个从CSV文件导入的数据帧 volume temperature(c) time(sec) 1000.1 10.4 26.5 1000.2 12.5 30.2 1000.3 13.2 40.5 . . . 8000.1 78 50.8 8000.2 79 51.5 我想创建一个新的数据框,我们定义一个时间窗口W(例如5秒),每W秒将使用特定窗口上的不同计算将每列的值聚合到一行,例如,平均值、标准

我正在使用python和panda数据帧。 我有一个从CSV文件导入的数据帧

         volume  temperature(c)
time(sec)
1000.1  10.4   26.5
1000.2  12.5   30.2
1000.3  13.2   40.5
.
.
.
8000.1  78   50.8
8000.2  79   51.5
我想创建一个新的数据框,我们定义一个时间窗口W(例如5秒),每W秒将使用特定窗口上的不同计算将每列的值聚合到一行,例如,平均值、标准z分数等。 输出数据帧的示例:

time(sec) mean_volume mean_temperature std_volume
1000.1  12.0.  32.4 1.4
1005.1  12.5   30.2 1.7
1010.1  11.7   30.1 1.5
.
.
.
我熟悉
df['new col']=data['source'].rolling(W).mean()
,这不是我的解决方案 我附上了一个例子

    T,H,L,C,label
1000.1,23.18,27.272,426,1
1000.2,23.15,27.2675,429.5,1
1000.3,23.15,27.245,426,1
1000.4,23.15,27.2,426,1
1000.5,23.1,27.2,426,1
1000.6,23.1,27.2,419,1
1000.7,23.1,27.2,419,1
1000.8,23.1,27.2,419,1
1000.9,23.1,27.2,419,1
1001,23.075,27.175,419,1
1001.1,23.075,27.15,419,1
1001.2,23.1,27.1,419,1
1001.3,23.1,27.16666667,419,1
1001.4,23.05,27.15,419,1
1001.5,23,27.125,419,1
1001.6,23,27.125,418.5,1
1001.7,23,27.2,0,0
1001.8,22.945,27.29,0,0
1001.9,22.945,27.39,0,0
1002,22.89,27.39,0,0
1002.1,22.89,27.39,0,0
1002.2,22.89,27.39,0,0
1002.3,22.89,27.445,0,0
对于上面的示例,我希望新的数据框将包含以下列:H_-mean、H_-std、L_-mean、C_-mean、L_-std、C_-std

此外,我如何在每个段上应用自定义函数(例如z-score)


谢谢,

鉴于您的数据位于一个名为
df
pd.DataFrame
中,下面应该可以实现这一点:

import pandas as pd
import numpy as np
step = 5
df.groupby(pd.cut(df.index,
                 np.arange(start=df.index.min(), stop=df.index.max(), step=step, 
                 dtype=float)))\
           .agg({'volume':['mean', 'std'], 'temperature':['mean']})
我们正在使用pd.cut创建一个
IntervalIndex
,我们可以
groupby
。最后,我们使用
pd.DataFrame.agg
计算各组的汇总统计数据<对于
volume
列,code>mean和
std
;对于
temperature
列,code>mean

我还没有测试过这个,但是如果你提供一个测试,我可以做到

编辑 根据更新的数据,我编写了以下代码:

In [1]: import pandas as pd

In [2]: import numpy as np

In [3]: from io import StringIO

In [4]: s = """T,H,L,C,label
   ...: 1000.1,23.18,27.272,426,1
   ...: 1000.2,23.15,27.2675,429.5,1
   ...: 1000.3,23.15,27.245,426,1
   ...: 1000.4,23.15,27.2,426,1
   ...: 1000.5,23.1,27.2,426,1
   ...: 1000.6,23.1,27.2,419,1
   ...: 1000.7,23.1,27.2,419,1
   ...: 1000.8,23.1,27.2,419,1
   ...: 1000.9,23.1,27.2,419,1
   ...: 1001,23.075,27.175,419,1
   ...: 1001.1,23.075,27.15,419,1
   ...: 1001.2,23.1,27.1,419,1
   ...: 1001.3,23.1,27.16666667,419,1
   ...: 1001.4,23.05,27.15,419,1
   ...: 1001.5,23,27.125,419,1
   ...: 1001.6,23,27.125,418.5,1
   ...: 1001.7,23,27.2,0,0
   ...: 1001.8,22.945,27.29,0,0
   ...: 1001.9,22.945,27.39,0,0
   ...: 1002,22.89,27.39,0,0
   ...: 1002.1,22.89,27.39,0,0
   ...: 1002.2,22.89,27.39,0,0
   ...: 1002.3,22.89,27.445,0,0"""

In [5]: df = pd.read_csv(StringIO(s), index_col='T')
我们再次使用
IntervalIndex
groupby
,以及agg来计算汇总统计数据

In [6]: step = 0.5
    ...: 
    ...: grouped = df.groupby(pd.cut(df.index,
    ...:                  np.arange(start=df.index.min(), stop=df.index.max(), step=step, dtype=float
    ...: )))
    ...: 

In [7]: grouped.agg({'H':['mean', 'std'], 'L':['mean', 'std'], 'C':['mean', 'std']})
Out[7]: 
                       H                    L                C          
                    mean       std       mean       std   mean       std
(1000.1, 1000.6]  23.130  0.027386  27.222500  0.031820  425.3  3.834058
(1000.6, 1001.1]  23.090  0.013693  27.185000  0.022361  419.0  0.000000
(1001.1, 1001.6]  23.050  0.050000  27.133333  0.025685  418.9  0.223607
(1001.6, 1002.1]  22.934  0.046016  27.332000  0.085557    0.0  0.000000
这并没有提供您想要的列名,因此让我们将列
MultiIndex
展平以调整它们

In [8]: aggregated = grouped.agg({'H':['mean', 'std'], 'L':['mean', 'std'], 'C':['mean', 'std']})

In [9]: ['_'.join(col).strip() for col in aggregated.columns.values]
Out[9]: ['H_mean', 'H_std', 'L_mean', 'L_std', 'C_mean', 'C_std']

In [10]: aggregated.columns = ['_'.join(col).strip() for col in aggregated.columns.values]

In [11]: aggregated
Out[11]: 
                  H_mean     H_std     L_mean     L_std  C_mean     C_std
(1000.1, 1000.6]  23.130  0.027386  27.222500  0.031820   425.3  3.834058
(1000.6, 1001.1]  23.090  0.013693  27.185000  0.022361   419.0  0.000000
(1001.1, 1001.6]  23.050  0.050000  27.133333  0.025685   418.9  0.223607
(1001.6, 1002.1]  22.934  0.046016  27.332000  0.085557     0.0  0.000000

我不太清楚应用Z-分数是什么意思,因为这不是一个汇总统计,不像
std
mean
,所以它不能很好地处理agg。如果您只想将Z分数按列应用于整个数据帧,我建议,您可能需要查看以下问题:

为什么滚动不是解决方案?请检查:嗨,我会根据您的请求更新我的问题。你的解决办法只能部分解决我的问题。谢谢你的编辑,让我知道我是否理解正确。您对问题的编辑很好,您获得了MCVE的完整和最小部分,但缺少代表可验证的V。如果你加上你期望的结果,我可以进一步帮助你。