用Python填充丢失的数据

时间:2019-04-18 18:26:11

标签: python missing-data fill

我对Python并不陌生,并且遇到这样的问题。我有多个传感器数据的数据框。数据集中没有NA缺失值,需要使用以下规则填充。

  1. 如果下一个传感器在同一时间戳上有数据,请使用下一个传感器数据填充它。
  2. 如果接近传感器也没有数据,请在同一时间戳上用所有可用传感器的平均值填充。
  3. 如果所有传感器在同一时间戳丢失数据,请使用其自身的线性插值来填充丢失的值

我构建了一个样本数据。

import pandas as pd
sensor1 = pd.DataFrame({"date": pd.date_range('1/1/2000', periods=10),"sensor":[1,1,1,1,1,1,1,1,1,1],"value":[np.nan,2,2,2,2,np.nan,np.nan,np.nan,4,6]})
sensor2 = pd.DataFrame({"date": pd.date_range('1/1/2000', periods=10),"sensor":[2,2,2,2,2,2,2,2,2,2],"value":[3,4,5,6,7,np.nan,np.nan,np.nan,7,8]})
sensor3 = pd.DataFrame({"date": pd.date_range('1/1/2000', periods=10),"sensor":[3,3,3,3,3,3,3,3,3,3],"value":[2,3,4,5,6,7,np.nan,np.nan,7,8]})
sensordata = sensor1.append([sensor2,sensor3]).reset_index(drop = True)

任何帮助将不胜感激。

有了克里斯蒂安的回答,解决方法如下。

# create  data
df1 = pd.DataFrame({"date": pd.date_range('1/1/2000', periods=10),"sensor":[1,1,1,1,1,1,1,1,1,1],"value":[np.nan,2,2,2,2,np.nan,np.nan,np.nan,4,6]})
df2 = pd.DataFrame({"date": pd.date_range('1/1/2000', periods=10),"sensor":[2,2,2,2,2,2,2,2,2,2],"value":[3,4,5,6,7,np.nan,np.nan,np.nan,7,8]})
df3 = pd.DataFrame({"date": pd.date_range('1/1/2000', periods=10),"sensor":[3,3,3,3,3,3,3,3,3,3],"value":[2,3,4,5,6,7,np.nan,np.nan,7,8]})
df = df1.append([df2,df3]).reset_index(drop = True)

# pivot dataframe
df = df.pivot(index = 'date', columns ='sensor',values ='value')

# step 1, using specified sensor to fill missing values first, here use sensor 3
for c in df.columns:
   selectedsensor = 3
   df[c] = df[c].fillna(df[selectedsensor])

# step 2, use average of all available sensors to fill
df = df.transpose().fillna(df.transpose().mean()).transpose()

# step 3, use interpolate to fill remaining missing values
df = df.interpolate()

# unstack back to the original data format
df = df.reset_index()
df = df.melt(id_vars=['date'],var_name = 'sensor')
#df = df.unstack('sensor').reset_index()
#df = df.rename(columns ={0:'value'})

最终输出如下:

         date sensor  value
0  2000-01-01      1    2.0
1  2000-01-02      1    2.0
2  2000-01-03      1    2.0
3  2000-01-04      1    2.0
4  2000-01-05      1    2.0
5  2000-01-06      1    7.0
6  2000-01-07      1    6.0
7  2000-01-08      1    5.0
8  2000-01-09      1    4.0
9  2000-01-10      1    6.0
10 2000-01-01      2    3.0
11 2000-01-02      2    4.0
12 2000-01-03      2    5.0
13 2000-01-04      2    6.0
14 2000-01-05      2    7.0
15 2000-01-06      2    7.0
16 2000-01-07      2    7.0
17 2000-01-08      2    7.0
18 2000-01-09      2    7.0
19 2000-01-10      2    8.0
20 2000-01-01      3    2.0
21 2000-01-02      3    3.0
22 2000-01-03      3    4.0
23 2000-01-04      3    5.0
24 2000-01-05      3    6.0
25 2000-01-06      3    7.0
26 2000-01-07      3    7.0
27 2000-01-08      3    7.0
28 2000-01-09      3    7.0
29 2000-01-10      3    8.0

1 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

您的数据集,已透视:

constexpr int g(int x) {
    if (x%2 == 0) h();
    return 0;
}

1)这是带有向后选项的fillna,沿轴1的限制为1

df = pd.DataFrame({"date": pd.date_range('1/1/2000', periods=10),"sensor1":[np.nan,2,2,2,2,np.nan,np.nan,np.nan,4,6], "sensor2":[3,4,5,6,7,np.nan,np.nan,np.nan,7,8], "sensor3":[2,3,4,5,6,7,np.nan,np.nan,7,8]}).set_index('date')

2)这是fillna,其平均值沿1轴。这显然并没有实现,但是我们可以通过转置来欺骗它:

df.fillna(method='bfill',limit=1,axis=1)

3)这只是内插

df.transpose().fillna(df.transpose().mean()).transpose()

奖金:

这有点丑陋,因为我必须逐列应用,但这是一个选择要填充的传感器3:

df.interpolate()