Pandas 库有一个非常好的函数调用 .fillna() 可用于填充空值
df = df.fillna(0)
我正在为我的新任务使用 Datatable Library,因为它在 Datatable 中加载和处理大量数据非常快。
fillna
python的Datatable库中是否存在这样的功能?
或者我们必须用什么替代方法来填充 Datatable 中的缺失值?
Pandas 库有一个非常好的函数调用 .fillna() 可用于填充空值
df = df.fillna(0)
我正在为我的新任务使用 Datatable Library,因为它在 Datatable 中加载和处理大量数据非常快。
fillna
python的Datatable库中是否存在这样的功能?
或者我们必须用什么替代方法来填充 Datatable 中的缺失值?
正如我在评论中所说,目前,没有复制所有 pandas 的内置函数fillna
;fillna
这篇文章着眼于如何在数据表中复制某些部分,以及明显的限制。另请注意,您可以在github 页面上针对此功能和您可能感兴趣的其他功能提出功能请求:
这里使用的示例来自 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]
熊猫:
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
在熊猫中:
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
那很简单。在数据表中复制它的一种方法是使用替换功能:
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函数的一个警告是它只会替换相似的类型(整数表示整数,浮点数表示浮点数,对象表示对象)。因此,(目前)替换 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]
请注意,空填充已完成两次(一次用于整数列,第二次用于浮点列)。fillna
它非常快,但是像Pandas 那样做一次就好了。我目前知道的唯一其他选择是使用字典理解:
DT[:,update(**{key: ifelse(f[key]==None,
0,
f[key])
for key in df.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]
让我们看一下 Pandasfillna
页面中的另一个示例,这次是字典:
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
同样,熊猫相对容易。在数据表中,您必须运行字典理解:
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 上,数据表返回
23.5 µs ± 671 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
熊猫返回时:
665 µs ± 11.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
所以,是的,数据表要快得多。
另请注意,pandas 具有ffill和bfill,它们非常有用,但在数据表中明显缺失,并且无法使用现有函数轻松复制(我不知道)。并且fillna
您可以使用参数填充行axis
。