Mau*_*ave 3 python pandas py-datatable
Pandas 库有一个非常好的函数调用 .fillna() ,它可以用来填充空值
df = df.fillna(0)
Run Code Online (Sandbox Code Playgroud)
我正在使用数据表库来完成我的新作业,因为它在数据表中加载和处理大量数据的速度非常快。
fillna
python的Datatable库中是否存在这样的函数?
或者我们必须用什么替代方法来填充数据表中的缺失值?
正如我在评论中所说,目前没有内置函数可以复制所有 pandas\' fillna
;这篇文章着眼于如何fillna
在数据表中复制 的某些部分,以及明显的限制。另请注意,您可以在GitHub 页面上针对此功能以及您可能感兴趣的其他功能提出功能请求:
这里使用的示例来自 pandas fillna页面,并进行了一些调整以说明一些重要的怪癖:
\nimport pandas as pd\nimport numpy as np\nfrom datatable import dt, f, ifelse, update\n
Run Code Online (Sandbox Code Playgroud)\n数据表:
\nDT = 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熊猫:
\ndf = 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在熊猫中:
\ndf.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那很简单。在数据表中复制此内容的一种方法是使用替换函数:
\nDT.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 值:
\nDT.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请注意,空值填充完成了两次(一次针对整数列,第二次针对浮点列)。它非常快,但最好只做一次,就像fillna
Pandas 那样只执行一次。目前我知道的唯一其他选择是使用字典理解:
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
页面上的另一个例子,这次是一个字典:
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 来说相对容易。在数据表中,您必须运行字典理解:
\nDT[:,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)\nSpeedwise,对于上面的字典操作,在我的电脑上,数据表返回
\n23.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 返回时:
\n665 \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 有ffill和bfill,它们非常有用,但在数据表中明显缺失,并且不能轻松地用现有函数复制(据我所知)。您可以使用参数fillna
跨行填充axis
。
同样,您可以访问GitHub 问题页面或讨论页面来发表您的意见并提出功能请求。
\n 归档时间: |
|
查看次数: |
2267 次 |
最近记录: |