需要在 python 中的 na 值之前用过去的三个值填充 NA 值
need to fill the NA values with the past three values before na values in python
需要用该 NA 的过去三个值的平均值填充 NA 值
这是我的数据集
RECEIPT_MONTH_YEAR NET_SALES
0 2014-01-01 818817.20
1 2014-02-01 362377.20
2 2014-03-01 374644.60
3 2014-04-01 北美
4 2014-05-01 不适用
5 2014-06-01 不适用
6 2014-07-01 NA
7 2014-08-01 46382.50
8 2014-09-01 55933.70
9 2014-10-01 292303.40
10 2014-10-01 382928.60
此数据集是 .csv 文件还是数据框。这个 NA 是 'NaN' 还是字符串 ?
import pandas as pd
import numpy as np
df=pd.read_csv('your dataset',sep=' ')
df.replace('NA',np.nan)
df.fillna(method='ffill',inplace=True)
你提到了一些关于 3 个值的平均值的事情..上面简单地向前填充了 NaN 开始之前的最后一个观察。这通常是一种很好的预测方法(如果坚持很重要,在某些情况下比采取手段更好)
ind = df['NET_SALES'].index[df['NET_SALES'].apply(np.isnan)]
Meanof3 = df.iloc[ind[0]-3:ind[0]].mean(axis=1,skipna=True)
df.replace('NA',Meanof3)
如果知道有关数据集的更多信息,也许可以推广和改进答案 - 就像您总是想在任何 NA 之前取最后 3 次测量的平均值。以上将允许您检查 NaN 的索引,然后在忽略任何 NaN
之前取 3 的平均值
这很简单但很有效
df_data.fillna(0,inplace=True)
for i in range(0,len(df_data)):
if df_data['NET_SALES'][i]== 0.00:
condtn = df_data['NET_SALES'][i-1]+df_data['NET_SALES'][i-2]+df_data['NET_SALES'][i-3]
df_data['NET_SALES'][i]=condtn/3
您可以使用 fillna(假设您的 NA 已经 np.nan)和滚动平均值:
import pandas as pd
import numpy as np
df = pd.DataFrame([818817.2,362377.2,374644.6,np.nan,np.nan,np.nan,np.nan,46382.5,55933.7,292303.4,382928.6], columns=["NET_SALES"])
df["NET_SALES"] = df["NET_SALES"].fillna(df["NET_SALES"].shift(1).rolling(3, min_periods=1).mean())
输出:
NET_SALES
0 818817.2
1 362377.2
2 374644.6
3 518613.0
4 368510.9
5 374644.6
6 NaN
7 46382.5
8 55933.7
9 292303.4
10 382928.6
如果你想包含推算值,我想你需要使用循环。
需要用该 NA 的过去三个值的平均值填充 NA 值
这是我的数据集
RECEIPT_MONTH_YEAR NET_SALES
0 2014-01-01 818817.20
1 2014-02-01 362377.20
2 2014-03-01 374644.60
3 2014-04-01 北美
4 2014-05-01 不适用
5 2014-06-01 不适用
6 2014-07-01 NA
7 2014-08-01 46382.50
8 2014-09-01 55933.70
9 2014-10-01 292303.40
10 2014-10-01 382928.60
此数据集是 .csv 文件还是数据框。这个 NA 是 'NaN' 还是字符串 ?
import pandas as pd
import numpy as np
df=pd.read_csv('your dataset',sep=' ')
df.replace('NA',np.nan)
df.fillna(method='ffill',inplace=True)
你提到了一些关于 3 个值的平均值的事情..上面简单地向前填充了 NaN 开始之前的最后一个观察。这通常是一种很好的预测方法(如果坚持很重要,在某些情况下比采取手段更好)
ind = df['NET_SALES'].index[df['NET_SALES'].apply(np.isnan)]
Meanof3 = df.iloc[ind[0]-3:ind[0]].mean(axis=1,skipna=True)
df.replace('NA',Meanof3)
如果知道有关数据集的更多信息,也许可以推广和改进答案 - 就像您总是想在任何 NA 之前取最后 3 次测量的平均值。以上将允许您检查 NaN 的索引,然后在忽略任何 NaN
之前取 3 的平均值这很简单但很有效
df_data.fillna(0,inplace=True)
for i in range(0,len(df_data)):
if df_data['NET_SALES'][i]== 0.00:
condtn = df_data['NET_SALES'][i-1]+df_data['NET_SALES'][i-2]+df_data['NET_SALES'][i-3]
df_data['NET_SALES'][i]=condtn/3
您可以使用 fillna(假设您的 NA 已经 np.nan)和滚动平均值:
import pandas as pd
import numpy as np
df = pd.DataFrame([818817.2,362377.2,374644.6,np.nan,np.nan,np.nan,np.nan,46382.5,55933.7,292303.4,382928.6], columns=["NET_SALES"])
df["NET_SALES"] = df["NET_SALES"].fillna(df["NET_SALES"].shift(1).rolling(3, min_periods=1).mean())
输出:
NET_SALES
0 818817.2
1 362377.2
2 374644.6
3 518613.0
4 368510.9
5 374644.6
6 NaN
7 46382.5
8 55933.7
9 292303.4
10 382928.6
如果你想包含推算值,我想你需要使用循环。