当前位置: 首页 > 知识库问答 >
问题:

Python区分'300'和'300.0'的数据帧列

东方明亮
2023-03-14

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

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

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

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

除了在每次打开不同的文件时不断更改列标签之外,是否还有其他方法可以让它在打开文件时自动区分“300”和“300.0”,或者强制“300.0”=“300”?

谢啦

共有3个答案

那弘
2023-03-14

此答案假设您只希望列名称中保留整数部分。它接受列名并进行浮点运算-

小心,如果列名称中有像“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)

为清楚起见,大多数“魔法”发生在中间线。我迭代当前存在的列,并将它们转换为形式的元组(旧名称、新名称)。rename使用该字典,然后为您进行重命名。

感谢用户Nipun Batra的回答,解释了df.rename。

濮阳旭东
2023-03-14

一些解决方案:

>

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

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

    在函数中包装列选择。使用try/除块让函数try访问给定的列,如果失败,使用另一种形式。

  • 后源
    2023-03-14

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

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

    或者,如果不需要整数值,则可以删除额外的int转换,并使用浮点字符串值:

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

    然后,可以使用df['300.0']代替df['300']

    如果不需要stringtype,那么我认为将它们转换为float也可以。

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

    然后,df[300.0]也可以工作。

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

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

    df.columns,df.columns

    更改为floatstring值,然后更改为df['300.0']

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

    更改为intstring值,然后df['300']

    df.columns=map(str, map(int, map(浮动,df.columns))

     类似资料:
    • 有人能解释一下将为Spark Dataframe创建的分区数量吗。 我知道对于RDD,在创建它时,我们可以提到如下分区的数量。 但是对于创建时的Spark数据帧,看起来我们没有像RDD那样指定分区数量的选项。 我认为唯一的可能性是,在创建数据帧后,我们可以使用重新分区API。 有人能告诉我在创建数据帧时,我们是否可以指定分区的数量。

    • 我们有没有可能在Spark中先按一列分区,然后再按另一列聚类? 在我的例子中,我在一个有数百万行的表中有一个< code>month列和一个< code>cust_id列。我可以说,当我将数据帧保存到hive表中,以便根据月份将该表分区,并按< code>cust_id将该表聚类成50个文件吗? 忽略按< code>cust_id的聚类,这里有三个不同的选项 第一种情况和最后一种情况在 Spark

    • 我需要使用 spark-sql 加载一个 Hive 表,然后对其运行一些机器学习算法。我是这样写的: 它工作得很好,但如果我想增加数据集数据帧的分区数,我该怎么做?使用普通RDD,我可以写: 我想要有N个分区。 谢谢

    • spark如何在使用< code>orderBy后确定分区的数量?我一直以为生成的数据帧有< code > spark . SQL . shuffle . partitions ,但这似乎不是真的: 在这两种情况下,spark都< code >-Exchange range partitioning(I/n ASC NULLS FIRST,200),那么第二种情况下的分区数怎么会是2呢?

    • [新加入Spark]语言-Scala 根据文档,RangePartitioner对元素进行排序并将其划分为块,然后将块分发到不同的机器。下面的例子说明了它是如何工作的。 假设我们有一个数据框,有两列,一列(比如“a”)的连续值从1到1000。还有另一个数据帧具有相同的模式,但对应的列只有4个值30、250、500、900。(可以是任意值,从1到1000中随机选择) 如果我使用RangePartit

    • 我想使用返回元组的函数将两列添加到数据帧