我有两个数据框,其中都是相对于某个开始时间的天数数据。一个数据帧是以比另一个数据帧信号数据更高的速率采样的信号数据。两个信号数据帧的总体时间帧相同。我的问题是我可以使用什么方法对具有更多行的行进行下采样以匹配行数。 数据框如下所示:(第一列是从特定开始时间算起的天数)
Days Data at 1hz
0 0.958 83.63
1 0.958 83.08
2 0.958 82.45
3 0.958 81.83
4 0.959 81.18
Days Data at 4hz
0 0.958 0.028
1 0.958 0.028
2 0.958 0.027
3 0.958 0.029
4 0.958 0.028
我已经尝试了 pandas.resample()
函数,但显然它只适用于时间戳索引。并且 rolling()
函数将 window = 8 上的其他值(data1 和 data2 的采样率差异)作为 Nan
并且不会删除行。
有没有办法,我可以应用 mean()
或其他一些方法,通过删除一些行使它们成为同一行?
最佳答案
使用 rolling
是个好主意,您缺少的是 dropna
之后删除多余的行。这是一个示例,df1
中每个日期有 3 行,df2
中每个日期有 8 行:
df1 = pd.DataFrame({'Date':[0.958]*3 + [0.959]*3,
'Data_1': [83.63,83.08,82.45,81.83,82.76,84.97]})
df2 = pd.DataFrame({'Date':[0.958]*8 + [0.959]*8,
'Data_4': [0.028,0.028,0.027,0.029]*4})
现在,您希望每个日期在 df2
中删除 5 行,以便仅获得 df1
中的 3 行,您可以使用 groupby
获取它, rolling
和 dropna
。如果您需要其他功能,可以更改函数 mean
,reset_index
更适合装饰。
df3 = df2.groupby('Date').rolling(window=6).mean().dropna().reset_index(drop=True)
它给出了 df3
Data_4 Date
0 0.028000 0.958
1 0.027833 0.958
2 0.028000 0.958
3 0.028000 0.959
4 0.027833 0.959
5 0.028000 0.959
df2
中的数据每个日期只有 3 行。
注意在rolling
中,window = 6
,就是df2和df1每个Date行数之差加1,否则你会得到额外的一行。
关于python-3.x - 下采样非时间序列数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51028493/