为什么vaex会改变包含句号的列名?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么vaex会改变包含句号的列名?相关的知识,希望对你有一定的参考价值。
当使用vaex时,我遇到了一个意想不到的错误。NameError: name 'column_2_0' is not defined
.
经过一番调查,我发现在我的数据源(HDF5文件)中,导致问题的列名实际上叫做 column_2.0
而VAEX将其更名为 column_2_0
但当使用列名执行操作时,我遇到了这个错误。下面是一个简单的例子,可以重现这个错误。
import pandas as pd
import vaex
cols = ['abc_1', 'abc1', 'abc.1']
vals = list(range(0,len(cols)))
df = pd.DataFrame([vals], columns=cols)
dfv = vaex.from_pandas(df)
for col in dfv.column_names:
dfv = dfv[dfv[col].notna()]
dfv.count()
...
NameError: name 'abc_1_1' is not defined
在这个例子中,vaex试图重命名... abc.1
到 abc_1
已经被占用了,所以它最终使用的是 abc_1_1
.
我知道我可以把列重命名为 dfv.rename('abc_1_1', 'abc_dot_1')
但是(a)我需要引入特殊的逻辑来解决命名冲突,比如在这个例子中,vaex 想出的列名已经被采用了;(b)我不希望每次当我有一个包含句号的列时,都要手动完成这个操作。
我也可以强制要求我所有来自源数据的列名永远不使用句号,但是考虑到pandas和其他数据来源一般没有这个限制,这似乎有点牵强。
除了我上面提到的两种方法之外,还有什么办法可以解决这个问题?
在Vaex中,列实际上是 "Expressions"。表达式允许你在做常规数据框架操作的同时,在幕后建立一种计算图。然而,这要求列名尽可能的 "干净"。
因此,像 "2 "或 "2.5 "这样的列名是不允许的,因为表达式系统可以将它们解释为数字而不是列名。另外像'first-name'这样的列名,表达式系统可以将其解释为 df['first'] - df['name']
.
为了避免这种情况,vaex会聪明地重命名列,以便在表达式系统中使用它们。这其实是非常复杂的。所以在您上面的例子中,您发现了一个还没有涉及到的情况(isna
notna
).
顺便说一下,你可以随时通过以下方式访问原始名称。df.get_column_names(alias=True)
.
以上是关于为什么vaex会改变包含句号的列名?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 CUDA 与 vaex(一个 Python 库)一起使用
什么是 Vaex 函数将字符串解析为 datetime64,相当于 pandas to_datetime,允许自定义格式?