- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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 有 ffill和 bfill ,它们非常有用,但在数据表中明显缺失,并且无法用现有函数轻松复制(据我所知)。在 fillna
中,您可以使用 axis
参数跨行填充。
希望对您有所帮助。同样,您可以访问 github issues页面或 discussions页面发表您的意见并提出功能请求。
关于python - 如何在python数据表中填充空值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65418449/
我是一名优秀的程序员,十分优秀!