python区分数据框列的'300'和'300.0'

Posted

技术标签:

【中文标题】python区分数据框列的\'300\'和\'300.0\'【英文标题】:python distinguish between '300' and '300.0' for a dataframe columnpython区分数据框列的'300'和'300.0' 【发布时间】:2018-04-26 17:04:47 【问题描述】:

最近我一直在开发一些代码来读取 csv 文件并将关键数据列存储在数据框中。之后我计划在数据框中的某些列上执行一些数学函数。

我已经相当成功地在数据框中存储了正确的列。我已经能够让它做任何必要的数学运算,例如求和、数据框列的添加、平均等。

我的问题在于一旦将特定列存储在数据框中就可以访问它们。我正在使用一个测试文件来让一切正常工作并管理这个没问题。当我打开一个不同的 csv 文件时会出现问题,它将数据存储在数据框中,但访问我想要的列不再有效,它在计算部分停止。

据我所知,问题在于它如何读取列名。列名都是数字。例如,df['300']、df['301'] 等。当访问列 df['300'] 在测试文件中工作正常,而下一个文件需要 df['300.0']。如果我切换到不同的文件,它可能需要 df['300'] 再次。所有数据都是以相同的方式获得的,所以我不确定为什么有些数据被读取为 300 而其他数据被读取为 300.0。

每次打开不同文件时都会不断更改列标签,是否有在打开文件时自动区分“300”和“300.0”,或者强制“300.0”=“300”?

谢谢

【问题讨论】:

你不能只做 df[str(int(300.0))] 吗? "是否有让它在打开文件时自动区分'300''300.0',或者强制'300.0' = '300'?" 需要决定哪一个适合您的问题。我敢打赌,他们会给你不同的结果。 【参考方案1】:

一些解决方案:

    浏览所有文件,更改列名,然后将结果保存在新文件夹中。现在,当您读取文件时,您可以转到新文件夹并从那里读取它。

    将正常的文件读取函数包装在另一个自动更改列名的函数中,并在读取文件时调用该新函数。

    将列选择包装在一个函数中。使用 try/except 块让函数尝试访问给定的列,如果失败,使用其他形式。

【讨论】:

【参考方案2】:

在您的数据框df 中,保持一致性的一种方法可能是转换为类似类型的列。您可以使用.columns 将所有列名更新为integerstring 值,从浮点数即'300.0''300',如下所示。然后,我认为使用字符串的整数值应该可以工作,即df['300]300以外的任何其他列。

df.columns = [str(int(float(column))) for column in df.columns]

或者,如果不需要integer值,可以去掉额外的int转换,使用浮点字符串值:

df.columns = [str(float(column)) for column in df.columns]

那么,df['300.0'] 可以代替df['300']

如果不需要string 类型,我认为转换它们float 也可以。

df.columns = [float(column) for column in df.columns]

那么,df[300.0] 也可以工作。

更改列名的其他替代方法可能是使用map

将所有列的值更改为float,然后如上所述使用df[300.0]

df.columns = map(float, df.columns)

float 的值更改为string,然后更改为df['300.0']

df.columns = map(str, map(float, df.columns))

int 的值更改为string,然后更改为df['300']

df.columns = map(str, map(int, map(float, df.columns)))

【讨论】:

根据我的阅读,写入 df.columns 不起作用,因为 pandas 单独保留了某种内部状态,您需要使用“重命名”功能(我的答案有例子)。不过我还没有投票,我不确定我的信息是否已过时。 @mbrig 不确定,但它适用于我使用的测试数据,使用熊猫版本0.21.0 可能只是更改单个列名(如df.columns[5] = 'new')不起作用,我不知道。我会留下我的答案作为替代方案,但你的答案看起来更简单,所以 +1。【参考方案3】:

此答案假定您只希望整数部分保留在列名中。它采用列名并执行 float->int->string 转换以去除小数位。

请注意,如果您有像“300.5”这样的数字作为列名,这会将它们变成“300”。

cols = df.columns.tolist()
new_columns = dict([(c,str(int(float(c)))) for c in cols])
df = df.rename(columns = new_columns)

为了清楚起见,大部分“魔法”都发生在中间线上。我遍历当前存在的列,并将它们转换为 (old_name, new_name) 形式的元组。 df.rename 获取该字典,然后为您进行重命名。

感谢Nipun Batra 用户 this answer 解释了 df.rename。

【讨论】:

以上是关于python区分数据框列的'300'和'300.0'的主要内容,如果未能解决你的问题,请参考以下文章

Python pandas,使用 .str.contains 搜索数据框列的子字符串时出错

在 Python/PySpark 中 Spark 复制数据框列的最佳实践?

python pil 怎么设定图片的dpi

ipa-server-install command failed, exception: RuntimeError: CA did not start in 300.0s

基于需要外部 API 调用的现有列创建新的 Spark 数据框列的最佳方法是啥?

熊猫数据框列的分组和计数