使用Python填充缺失的数据

问题描述 投票:1回答:1

我对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)

任何帮助,将不胜感激。

根据Christian的回答,解决方案如下。

# 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
python missing-data fill
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')

1)这是具有向后选项的fillna,沿轴1的limit = 1

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

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

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

3)这只是插值

df.interpolate()

奖金:

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

for c in df.columns:
   df[c] = df[c].fillna(df["sensor3"])
df
© www.soinside.com 2019 - 2024. All rights reserved.