2

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

df = df.fillna(0)

我正在为我的新任务使用 Datatable Library,因为它在 Datatable 中加载和处理大量数据非常快。

fillnapython的Datatable库中是否存在这样的功能?

或者我们必须用什么替代方法来填充 Datatable 中的缺失值?

4

1 回答 1

3

正如我在评论中所说,目前,没有复制所有 pandas 的内置函数fillnafillna这篇文章着眼于如何在数据表中复制某些部分,以及明显的限制。另请注意,您可以在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 具有ffillbfill,它们非常有用,但在数据表中明显缺失,并且无法使用现有函数轻松复制(我不知道)。并且fillna您可以使用参数填充行axis

希望这个对你有帮助。同样,您可以访问github 问题页面或讨论页面来发表您的意见并提出功能请求。

于 2020-12-23T10:56:59.983 回答