最近,我一直在开发一些代码来读取csv文件并将关键数据列存储在数据框中。之后,我计划对数据帧中的某些列执行一些数学函数。
我已经相当成功地在数据框中存储了正确的列。我已经能够让它做任何数学是必要的,如求和,添加数据框列,平均等。
我的问题在于,一旦特定列存储在数据帧中,就要访问它们。我正在使用一个测试文件,以使一切正常工作,并没有问题地处理了这个问题。当我打开一个不同的csv文件时会出现问题,它会将数据存储在dataframe中,但是访问我想要的列不再有效,它会在计算部分停止。
据我所知,问题在于如何读取列名。列名都是数字。例如,在访问列df['300']时,df['300']和df['301']等在testfile中工作正常,而下一个文件需要df['300.0']。如果我切换到另一个文件,它可能需要再次使用df['300']。所有数据都是以相同的方式获得的,因此我不确定为什么有些数据被解读为300,而其他数据被解读为300.0。
除了在每次打开不同的文件时不断更改列标签之外,是否还有其他方法可以让它在打开文件时自动区分“300”和“300.0”,或者强制“300.0”=“300”?
谢啦
此答案假设您只希望列名称中保留整数部分。它接受列名并进行浮点运算-
小心,如果列名称中有像“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。
一些解决方案:
>
浏览所有文件,更改列名,然后将结果保存在新文件夹中。现在,当您读取文件时,您可以转到新文件夹并从那里读取它。
将普通文件读取函数包装在另一个自动更改列名的函数中,并在读取文件时调用该新函数。
在函数中包装列选择。使用try/除块让函数try访问给定的列,如果失败,使用另一种形式。
在数据帧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']
。
如果不需要
string
type,那么我认为将它们转换为float
也可以。
df.columns = [float(column) for column in df.columns]
然后,
df[300.0]
也可以工作。
更改列名的其他替代方法可以使用
map
:
将所有列更改为
float
值,然后如上所述使用df[300.0]
:
df.columns,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(浮动,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
我想使用返回元组的函数将两列添加到数据帧