Pandas滚动意味着不会在DataFrame中将数字更改为NaN

时间:2017-07-14 15:04:29

标签: python-3.x pandas dataframe moving-average

我正在使用pandas DataFrame,如下所示:

(** N.B - 将偏移量设置为DataFrame的索引)

offset         X         Y         Z
  0   -0.140137   -1.924316   -0.426758
 10   -2.789123   -1.111212   -0.416016
 20   -0.133789   -1.923828   -4.408691
 30   -0.101112   -1.457891   -0.425781
 40   -0.126465   -1.926758   -0.414062
 50   -0.137207   -1.916992   -0.404297
 60   -0.130371   -3.784591   -0.987654
 70   -0.125000   -1.918457   -0.403809
 80   -0.123456   -1.917480   -0.413574
 90   -0.126465   -1.926758   -0.333554

我已使用以下代码将窗口大小= 5的滚动均值应用于数据框。 我需要保持这个窗口大小= 5,我需要所有偏移值(无NaN)的整个数据帧的值。

df = df.rolling(center=False, window=5).mean()

这给了我:

offset         X         Y         Z
 0.0       NaN       NaN       NaN
10.0       NaN       NaN       NaN
20.0       NaN       NaN       NaN
30.0       NaN       NaN       NaN
40.0 -0.658125 -1.668801 -1.218262
50.0 -0.657539 -1.667336 -1.213769
60.0 -0.125789 -2.202012 -1.328097
70.0 -0.124031 -2.200938 -0.527121
80.0 -0.128500 -2.292856 -0.524679
90.0 -0.128500 -2.292856 -0.508578

我希望DataFrame能够保持NaN的第一个值不变,并将其余的值作为滚动均值的结果。有没有一种简单的方法可以做到这一点?感谢

offset         X         Y         Z
 0.0  -0.140137  -1.924316  -0.426758
10.0  -2.789123  -1.111212  -0.416016
20.0  -0.133789  -1.923828  -4.408691
30.0  -0.101112  -1.457891  -0.425781
40.0  -0.658125  -1.668801  -1.218262
50.0  -0.657539  -1.667336  -1.213769
60.0  -0.125789  -2.202012  -1.328097
70.0  -0.124031  -2.200938  -0.527121
80.0  -0.128500  -2.292856  -0.524679
90.0  -0.128500  -2.292856  -0.508578

2 个答案:

答案 0 :(得分:5)

您可以填写原始df:

scripts

还有一个参数,你可以使用min_periods。如果你传递df.rolling(center=False, window=5).mean().fillna(df) Out: X Y Z offset 0 -0.140137 -1.924316 -0.426758 10 -2.789123 -1.111212 -0.416016 20 -0.133789 -1.923828 -4.408691 30 -0.101112 -1.457891 -0.425781 40 -0.658125 -1.668801 -1.218262 50 -0.657539 -1.667336 -1.213769 60 -0.125789 -2.202012 -1.328097 70 -0.124031 -2.200938 -0.527121 80 -0.128500 -2.292856 -0.524679 90 -0.128500 -2.292856 -0.508578 那么它将取第一个值,第二个值作为前两个的平均值等等。在某些情况下可能更有意义。

min_periods=1

答案 1 :(得分:0)

假设您没有包含所有NaN的其他行,您可以确定哪些行包含您的rolling_df中的所有NaN,并将其替换为原始行中的相应行。例如:

df=pd.DataFrame(np.random.rand(13,5))
df_rolling=df.rolling(center=False,window=5).mean()
#identify which rows are all NaN
idx = df_rolling.index[df_rolling.isnull().all(1)]
#replace those rows with the original data
df_rolling.loc[idx,:]=df.loc[idx,:]