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

Mau*_*ave 3 python pandas py-datatable

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

df = df.fillna(0)
Run Code Online (Sandbox Code Playgroud)

我正在使用数据表库来完成我的新作业,因为它在数据表中加载和处理大量数据的速度非常快。

fillnapython的Datatable库中是否存在这样的函数?

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

sam*_*mmy 5

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

\n

这里使用的示例来自 pandas fillna页面,并进行了一些调整以说明一些重要的怪癖

\n
import pandas as pd\nimport numpy as np\nfrom datatable import dt, f, ifelse, update\n
Run Code Online (Sandbox Code Playgroud)\n

数据表:

\n
DT = dt.Frame(\n{\n    "A": [None, 3.0, None, None],\n    "B": [2, 4, None, 3],\n    "C": [np.nan, np.nan, np.nan, np.nan],\n    "D": [0, 1, 5, 4],\n})\n\nDT\n\n          A      B        C      D\n   | float64  int32  float64  int32\n-- + -------  -----  -------  -----\n 0 |      NA      2       NA      0\n 1 |       3      4       NA      1\n 2 |      NA     NA       NA      5\n 3 |      NA      3       NA      4\n[4 rows x 4 columns]\n
Run Code Online (Sandbox Code Playgroud)\n

熊猫:

\n
df = pd.DataFrame([[np.nan, 2, np.nan, 0],\n                   [3, 4, np.nan, 1],\n                   [np.nan, np.nan, np.nan, 5],\n                   [np.nan, 3, np.nan, 4]],\n                   columns=list(\'ABCD\'))\n\ndf\n\n    A    B   C  D\n0  NaN  2.0 NaN  0\n1  3.0  4.0 NaN  1\n2  NaN  NaN NaN  5\n3  NaN  3.0 NaN  4\n
Run Code Online (Sandbox Code Playgroud)\n

在熊猫中:

\n
df.fillna(0)\n    A   B   C   D\n0   0.0 2.0 0.0 0\n1   3.0 4.0 0.0 1\n2   0.0 0.0 0.0 5\n3   0.0 3.0 0.0 4\n
Run Code Online (Sandbox Code Playgroud)\n

那很简单。在数据表中复制此内容的一种方法是使用替换函数:

\n
DT.replace({None:0})\n\n   |       A      B        C      D\n   | float64  int32  float64  int32\n-- + -------  -----  -------  -----\n 0 |      NA      2       NA      0\n 1 |       3      4       NA      1\n 2 |      NA      0       NA      5\n 3 |      NA      3       NA      4\n[4 rows x 4 columns]\n
Run Code Online (Sandbox Code Playgroud)\n

请注意,仅替换了整数列中的空值;替换函数的一个警告是,它只会替换相似的类型(整数替换整数,浮点替换浮点,对象替换对象)。因此,(目前)替换 float 的 null 值的唯一方法是传递 float 值:

\n
DT.replace({None:0.0})\n\nDT\nOut[15]: \n   |       A      B        C      D\n   | float64  int32  float64  int32\n-- + -------  -----  -------  -----\n 0 |       0      2        0      0\n 1 |       3      4        0      1\n 2 |       0     NA        0      5\n 3 |       0      3        0      4\n[4 rows x 4 columns]\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
DT[:,update(**{key: ifelse(f[key]==None,\n                              0, \n                              f[key]) \n    for key in DT.names})]\n\nDT\nOut[20]: \n   |       A      B        C      D\n   | float64  int32  float64  int32\n-- + -------  -----  -------  -----\n 0 |       0      2        0      0\n 1 |       3      4        0      1\n 2 |       0      0        0      5\n 3 |       0      3        0      4\n[4 rows x 4 columns]\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
values = {\'A\': 0, \'B\': 1, \'C\': 2, \'D\': 3}\ndf.fillna(value=values)\n    A   B   C   D\n0   0.0 2.0 2.0 0\n1   3.0 4.0 2.0 1\n2   0.0 1.0 2.0 5\n3   0.0 3.0 2.0 4\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
DT[:,update(**{key: ifelse(f[key]==None, \n                              value, \n                              f[key]) \n  for key, value in values.items()})]\n\nDT\nOut[25]: \n   |       A      B        C      D\n   | float64  int32  float64  int32\n-- + -------  -----  -------  -----\n 0 |       0      2        2      0\n 1 |       3      4        2      1\n 2 |       0      1        2      5\n 3 |       0      3        2      4\n[4 rows x 4 columns]\n
Run Code Online (Sandbox Code Playgroud)\n

Speedwise,对于上面的字典操作,在我的电脑上,数据表返回

\n
23.5 \xc2\xb5s \xc2\xb1 671 ns per loop (mean \xc2\xb1 std. dev. of 7 runs, 10000 loops each)\n
Run Code Online (Sandbox Code Playgroud)\n

当 Pandas 返回时:

\n
665 \xc2\xb5s \xc2\xb1 11.4 \xc2\xb5s per loop (mean \xc2\xb1 std. dev. of 7 runs, 1000 loops each)\n
Run Code Online (Sandbox Code Playgroud)\n

所以,是的,数据表很重要更快。

\n

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

\n

同样,您可以访问GitHub 问题页面或讨论页面来发表您的意见并提出功能请求。

\n