Python 为什么vaex会更改包含句点的列名?

Python 为什么vaex会更改包含句点的列名?,python,vaex,Python,Vaex,使用vaex时,我遇到一个意外错误NameError:name“column\u 2\u 0”未定义 经过一些调查,我发现在我的数据源(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(co

使用vaex时,我遇到一个意外错误
NameError:name“column\u 2\u 0”未定义

经过一些调查,我发现在我的数据源(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()
在这种情况下,vaex似乎试图将
abc.1
重命名为
abc_1
,这已被采用,因此它最终使用
abc_1_1

我知道我可以像
dfv.rename('abc_1_1','abc_dot_1')
那样重命名列,但是(a)我需要为命名冲突引入特殊的逻辑,比如在本例中,vaex提供的列名已经被使用,(b)我不希望每次有一个包含句点的列时都必须手动执行此操作

我还可以强制源数据中的所有列名不使用句点,但这似乎是一个延伸,因为pandas和其他数据来源通常不具有此限制


除了我上面提到的两个问题之外,还有什么其他的解决方法呢?

在Vaex中,这些列实际上是“表达式”。表达式允许您在执行常规数据帧操作时在后台构建某种计算图。但是,这要求列名尽可能“干净”

因此不允许使用“2”或“2.5”之类的列名,因为表达式系统可以将它们解释为数字而不是列名。还有像“first name”这样的列名,表达式系统可以解释为
df['first']-df['name']

为了避免这种情况,vaex将巧妙地重命名列,以便在表达式系统中使用它们。这其实是非常复杂的。因此,在上面的示例中,您发现了一个尚未涉及的案例(
isna
/
notna

顺便说一句,您始终可以通过
df.get\u column\u names(alias=True)
访问原始名称

...
NameError: name 'abc_1_1' is not defined