Python 2.7 从系列构建新的数据帧
因为我仍然不知道如何正确地做我想做的事情,所以我再次尝试我的一个朋友 我将数据存储在数据帧中,需要提取数据的平均块以供以后使用。我的索引是datetime值,但这并不十分重要。不幸的是,我无法执行简单的df.resample()操作,因为我需要提取的数据间隔不规则。例如:Python 2.7 从系列构建新的数据帧,python-2.7,pandas,Python 2.7,Pandas,因为我仍然不知道如何正确地做我想做的事情,所以我再次尝试我的一个朋友 我将数据存储在数据帧中,需要提取数据的平均块以供以后使用。我的索引是datetime值,但这并不十分重要。不幸的是,我无法执行简单的df.resample()操作,因为我需要提取的数据间隔不规则。例如: import pandas as pd from numpy import * # Build example dataframe df = pd.DataFrame(data=random.rand(10,3),index
import pandas as pd
from numpy import *
# Build example dataframe
df = pd.DataFrame(data=random.rand(10,3),index=None,columns=list('ABC'))
# Build dummy dataframe to store averaged data from "df"
dummy = pd.DataFrame(columns=df.columns)
# Perform averaging of "df"
for r in xrange(1,10,2):
ave = df.ix[r-1:r+1].mean()
# Store averaged data in dummy dataframe
# Here is where I hit my problem, since ave is a Series
dummy = dummy.append(ave)
我无法将序列附加到数据帧。我可以通过将ave转换为字典,然后附加到dummy来解决这个问题:
for r in xrange(1,10,2):
ave = df.ix[r-1:r+1].mean().to_dict()
ave = pd.DataFrame(ave,index=[r])
dummy = dummy.append(ave)
第一:我的总体目标有意义吗?第二:有没有更好的方法来实现这一点?转换为字典,然后是数据帧,然后是追加似乎很困难,但这是我最好的 开始编辑 联合国大学提出了一个很好的观点。如前所述,滚动_mean()将起作用。但是,我只对很少几行数据感兴趣,其他的都被认为是垃圾
# Now creating larger dataframe for illustration
df = pd.DataFrame(data=random.rand(10000,3),index=None,columns=list('ABC'))
# Now, most of the data are not averaged
for r in xrange(1,10000,50):
ave = df.ix[r-1:r+1].mean().to_dict()
ave = pd.DataFrame(ave,index=[r])
我在示例中遇到的主要问题是显示平均值的不规则性。平均值是由事件驱动的(即,如果在2013-01-01 14:23发生了什么,则对2013-01-01 14:23+/-2.5分钟的数据进行平均
不幸的是,数据时间戳也是高度不规则的,这使得rolling_mean()在这种情况下无效。因此,我有不规则的事件来确定何时平均我不规则记录的数据,这是一个很好的问题
我可以实现我想要的,但只能通过将ave从series转换为dictionary,然后再转换为dataframe来实现。也许在这种情况下,“足够好”就不必说了
结束编辑
dummy=dummy.append(ave)听起来你要找的是: 屈服
A B C
2 0.301872 0.404214 0.163073
3 0.342470 0.303837 0.391442
4 0.309843 0.547624 0.369792
5 0.471245 0.571539 0.423766
6 0.338436 0.497841 0.462274
7 0.593039 0.309610 0.683919
8 0.661679 0.468711 0.526037
9 0.627902 0.459287 0.551836
这是另一种使用datelike索引的方法
In [67]: df = pd.DataFrame(data=np.random.rand(10,3), index=None, columns=list('ABC'))
In [68]: df
Out[68]:
A B C
0 0.417022 0.720324 0.000114
1 0.302333 0.146756 0.092339
2 0.186260 0.345561 0.396767
3 0.538817 0.419195 0.685220
4 0.204452 0.878117 0.027388
5 0.670468 0.417305 0.558690
6 0.140387 0.198101 0.800745
7 0.968262 0.313424 0.692323
8 0.876389 0.894607 0.085044
9 0.039055 0.169830 0.878143
这是一个常规索引,但在时间上是不规则的(或至少是假装的)
每3个数据(不管是不是他们的)都要认真对待(如果你想的话,你也可以做得更出色)。他们有更多的选择(例如,包括哪一面,标签放在哪里等,请参阅
不完全正确。正如我在示例中所写的,滚动平均值将起作用。但我不需要所有的数据。我将编辑我的帖子以显示一个示例。@ubuntu:是否希望
dummy=pd.rolling平均值(df,window=3).shift(-1).dropna()
使窗口集中在当前观察点而不是结束于当前观察点?或者,如果您愿意,您可以执行dummy=pd.rolling\u mean(df,window=3,center=True)。dropna()
此外,根据设置,设置min\u periods=3
以强制执行边缘案例可能很有用。
In [67]: df = pd.DataFrame(data=np.random.rand(10,3), index=None, columns=list('ABC'))
In [68]: df
Out[68]:
A B C
0 0.417022 0.720324 0.000114
1 0.302333 0.146756 0.092339
2 0.186260 0.345561 0.396767
3 0.538817 0.419195 0.685220
4 0.204452 0.878117 0.027388
5 0.670468 0.417305 0.558690
6 0.140387 0.198101 0.800745
7 0.968262 0.313424 0.692323
8 0.876389 0.894607 0.085044
9 0.039055 0.169830 0.878143
In [69]: df.index=date_range('20130101 09:00:58',periods=10,freq='s')
In [70]: df
Out[70]:
A B C
2013-01-01 09:00:58 0.417022 0.720324 0.000114
2013-01-01 09:00:59 0.302333 0.146756 0.092339
2013-01-01 09:01:00 0.186260 0.345561 0.396767
2013-01-01 09:01:01 0.538817 0.419195 0.685220
2013-01-01 09:01:02 0.204452 0.878117 0.027388
2013-01-01 09:01:03 0.670468 0.417305 0.558690
2013-01-01 09:01:04 0.140387 0.198101 0.800745
2013-01-01 09:01:05 0.968262 0.313424 0.692323
2013-01-01 09:01:06 0.876389 0.894607 0.085044
2013-01-01 09:01:07 0.039055 0.169830 0.878143
In [71]: df.resample('3s',how=lambda x: x.mean())
Out[71]:
A B C
2013-01-01 09:00:57 0.359677 0.433540 0.046226
2013-01-01 09:01:00 0.309843 0.547624 0.369792
2013-01-01 09:01:03 0.593039 0.309610 0.683919
2013-01-01 09:01:06 0.457722 0.532219 0.481593