gpt4 book ai didi

python - 如何在python数据表中填充空值?

转载 作者:行者123 更新时间:2023-12-05 02:03:07 29 4
gpt4 key购买 nike

Pandas 库有一个非常好的函数调用 .fillna(),可用于填充空值

df = df.fillna(0)

我正在为我的新任务使用数据表库,因为它可以非常快速地加载和处理数据表中的大量数据。

python的Datatable库中有fillna这样的函数吗?

或者我们有什么替代方法可以填充 Datatable 中的缺失值?

最佳答案

正如我在评论中所说,目前,没有内置函数可以复制所有 pandas 的 fillna;这篇文章着眼于如何在数据表中复制 fillna 的某些部分,以及明显的限制。另请注意,您可以在 github page 上提出功能请求对于此功能和您可能感兴趣的其他功能:

这里使用的例子来自pandas fillna页面并做了一些调整以说明一些重要的怪癖:

import pandas as pd
import numpy as np
from datatable import dt, f, ifelse, update

数据表:

DT = dt.Frame(
{
"A": [None, 3.0, None, None],
"B": [2, 4, None, 3],
"C": [np.nan, np.nan, np.nan, np.nan],
"D": [0, 1, 5, 4],
})

DT

A B C D
| float64 int32 float64 int32
-- + ------- ----- ------- -----
0 | NA 2 NA 0
1 | 3 4 NA 1
2 | NA NA NA 5
3 | NA 3 NA 4
[4 rows x 4 columns]

Pandas :

df = pd.DataFrame([[np.nan, 2, np.nan, 0],
[3, 4, np.nan, 1],
[np.nan, np.nan, np.nan, 5],
[np.nan, 3, np.nan, 4]],
columns=list('ABCD'))

df

A B C D
0 NaN 2.0 NaN 0
1 3.0 4.0 NaN 1
2 NaN NaN NaN 5
3 NaN 3.0 NaN 4

在 Pandas 中:

df.fillna(0)
A B C D
0 0.0 2.0 0.0 0
1 3.0 4.0 0.0 1
2 0.0 0.0 0.0 5
3 0.0 3.0 0.0 4

这很容易。在数据表中复制它的一种方法是使用 replace功能:

DT.replace({None:0})

| A B C D
| float64 int32 float64 int32
-- + ------- ----- ------- -----
0 | NA 2 NA 0
1 | 3 4 NA 1
2 | NA 0 NA 5
3 | NA 3 NA 4
[4 rows x 4 columns]

请注意,只有整数列中的空值被替换; replace 的一个警告作用是只会替换相似类型(integer换integer,float换float,object换object)。因此,(目前)为 float 替换 null 值的唯一方法是传递一个 float 值:

DT.replace({None:0.0})

DT
Out[15]:
| A B C D
| float64 int32 float64 int32
-- + ------- ----- ------- -----
0 | 0 2 0 0
1 | 3 4 0 1
2 | 0 NA 0 5
3 | 0 3 0 4
[4 rows x 4 columns]

请注意空值填充完成了两次(一次用于整数列,第二次用于 float 列)。它非常快,但最好像 Pandas 中的 fillna 那样只执行一次。我目前唯一知道的其他选择是使用字典理解:

DT[:,update(**{key: ifelse(f[key]==None,
0,
f[key])
for key in DT.names})]

DT
Out[20]:
| A B C D
| float64 int32 float64 int32
-- + ------- ----- ------- -----
0 | 0 2 0 0
1 | 3 4 0 1
2 | 0 0 0 5
3 | 0 3 0 4
[4 rows x 4 columns]

让我们看一下 Pandas fillna 页面中的另一个例子,这次是字典:

values = {'A': 0, 'B': 1, 'C': 2, 'D': 3}
df.fillna(value=values)
A B C D
0 0.0 2.0 2.0 0
1 3.0 4.0 2.0 1
2 0.0 1.0 2.0 5
3 0.0 3.0 2.0 4

同样,Pandas 相对容易。在数据表中,您必须运行字典理解:

DT[:,update(**{key: ifelse(f[key]==None, 
value,
f[key])
for key, value in values.items()})]

DT
Out[25]:
| A B C D
| float64 int32 float64 int32
-- + ------- ----- ------- -----
0 | 0 2 2 0
1 | 3 4 2 1
2 | 0 1 2 5
3 | 0 3 2 4
[4 rows x 4 columns]

Speedwise,对于上面的字典操作,在我的PC上,datatable返回

23.5 µs ± 671 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

当 Pandas 返回时:

665 µs ± 11.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

所以,是的,数据表明显更快。

还要注意 pandas 有 ffillbfill ,它们非常有用,但在数据表中明显缺失,并且无法用现有函数轻松复制(据我所知)。在 fillna 中,您可以使用 axis 参数跨行填充。

希望对您有所帮助。同样,您可以访问 github issues页面或 discussions页面发表您的意见并提出功能请求。

关于python - 如何在python数据表中填充空值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65418449/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com