python-3.x 使用Pandas填写缺失数据

smdncfj3  于 2023-01-18  发布在  Python
关注(0)|答案(2)|浏览(155)

什么是最好的方法来填补缺失的数据使用Pandas。我有一个名单的游客在那里的出口时间或入口时间是失踪。

visitor entry            exit
A   16/02/2016 08:46    16/02/2016 09:01
A   16/02/2016 09:20    16/02/2016 17:24
A   17/02/2016 09:12    17/02/2016 09:42
A   17/02/2016 09:55    NaT
A   17/02/2016 12:42    17/02/2016 12:56
A   17/02/2016 13:02    17/02/2016 17:32
A   17/02/2016 17:44    17/02/2016 18:24
A   18/02/2016 07:59    18/02/2016 16:40
A   18/02/2016 16:53    NaT
A   NaT                 19/02/2016 09:11
A   19/02/2016 09:27    19/02/2016 11:26
A   19/02/2016 12:28    19/02/2016 17:12
A   20/02/2016 08:44    20/02/2016 08:58
A   20/02/2016 09:16    20/02/2016 17:21
u4vypkhs

u4vypkhs1#

您可以使用DataFrame.ffill + DataFrame.bfill来完成相同的进入/退出时间:

df[['entry','exit']]=df[['entry','exit']].ffill(axis=1).bfill(axis=1)
print(df)
   visitor               entry                exit
0        A 2016-02-16 08:46:00 2016-02-16 09:01:00
1        A 2016-02-16 09:20:00 2016-02-16 17:24:00
2        A 2016-02-17 09:12:00 2016-02-17 09:42:00
3        A 2016-02-17 09:55:00 2016-02-17 09:55:00
4        A 2016-02-17 12:42:00 2016-02-17 12:56:00
5        A 2016-02-17 13:02:00 2016-02-17 17:32:00
6        A 2016-02-17 17:44:00 2016-02-17 18:24:00
7        A 2016-02-18 07:59:00 2016-02-18 16:40:00
8        A 2016-02-18 16:53:00 2016-02-18 16:53:00
9        A 2016-02-19 09:11:00 2016-02-19 09:11:00
10       A 2016-02-19 09:27:00 2016-02-19 11:26:00
11       A 2016-02-19 12:28:00 2016-02-19 17:12:00
12       A 2016-02-20 08:44:00 2016-02-20 08:58:00
13       A 2016-02-20 09:16:00 2016-02-20 17:21:00
    • 编辑**

DataFrame.notna + DataFrame.all,用于执行boolean indexing,用于过滤具有NaT值的ros,以计算差值的平均值
x一个一个一个一个x一个一个二个x

    • 用平均值填充缺失值**
#roud to seconds( optional)
time_dif_mean_round_second=time_dif_mean.round('s')

df['entry'].fillna(df['exit']-time_dif_mean_round_second,inplace=True)
df['exit'].fillna(df['entry']+time_dif_mean_round_second,inplace=True)
print(df)
    • 输出:**
visitor               entry                exit
0        A 2016-02-16 08:46:00 2016-02-16 09:01:00
1        A 2016-02-16 09:20:00 2016-02-16 17:24:00
2        A 2016-02-17 09:12:00 2016-02-17 09:42:00
3        A 2016-02-17 09:55:00 2016-02-17 13:21:55
4        A 2016-02-17 12:42:00 2016-02-17 12:56:00
5        A 2016-02-17 13:02:00 2016-02-17 17:32:00
6        A 2016-02-17 17:44:00 2016-02-17 18:24:00
7        A 2016-02-18 07:59:00 2016-02-18 16:40:00
8        A 2016-02-18 16:53:00 2016-02-18 20:19:55
9        A 2016-02-19 05:44:05 2016-02-19 09:11:00
10       A 2016-02-19 09:27:00 2016-02-19 11:26:00
11       A 2016-02-19 12:28:00 2016-02-19 17:12:00
12       A 2016-02-20 08:44:00 2016-02-20 08:58:00
13       A 2016-02-20 09:16:00 2016-02-20 17:21:00
rsl1atfo

rsl1atfo2#

我最好的办法是采取以下几个步骤:

1.创建一个新列,表示访问者停留的总持续时间

visitor_log['duration'] = visitor_log['exit'] - visitor_log['entry']

您可以参考this question了解如何查找2个DateTime之间的差异。

2.求新列的平均值

mean_duration = visitor_log['duration'].mean()

3.使用该平均值填充入口列或出口列中的缺失数据

visitor_log["entry"].fillna(value=visitor_log["exit"]-mean_duration,inplace=True)
visitor_log["exit"].fillna(value=visitor_log["entry"]+mean_duration,inplace=True)

注意,您需要设置inplace=True来修改现有的DataFrame。

相关问题