【问题标题】:Iterating over a dataframe changes the column structure遍历数据框会更改列结构
【发布时间】:2021-03-03 18:28:20
【问题描述】:

我看到很多帖子都用 iterrows() 强调了这种行为,但是我们正在用 .columns 和 .dtypes 观察它。

这里有两段关键代码

#1。一个简单的循环遍历数据帧

for col in df.columns:
    print("hello")

#A line of code that performs a join with the dataframe

files = target.join(df, primaryKeys, 'inner').select(col("filepath").alias("filepath1")).distinct()

如果没有 for 循环,这可以正常工作。但是,当上面的 for 循环未注释时,这会失败,因为 'str' object is not callable。如果我们尝试使用

for col in df.dtypes:
    print("hello")

失败了

'tuple' 对象不可调用。

我也试过

select_expr = [
    col(c).cast("smallint") if t == "tinyint)" else col(c) for c, t in df4.dtypes
]
df4 = df4.select(*select_expr)

失败了

'str' 对象不可调用。

为什么迭代 for 循环的行为会导致连接失败?迭代是否会以某种方式改变底层数据框?我之前已经看到 iterrows 发生过这种情况,但是正如我在上面展示的那样,有很多使用列/d​​types 的代码示例都可以正常工作。

【问题讨论】:

  • 可能是因为您将 col 定义为一些列名称列表,然后用迭代时使用的变量(存储元组或字符串)覆盖它
  • @ALollz 你说的完全正确

标签: python pandas apache-spark pyspark


【解决方案1】:

尝试使用import pyspark.sql.functions as FF.col(c) 而不是col(c)

在for循环内部,col被替换为for col in df.columns中的迭代变量col,这是一个字符串。

当您编写col(c) 时,您调用col 时带有一个参数c,但col 是一个字符串变量,所以您得到str object is not callable 错误。

【讨论】:

  • 这就是我所缺少的,为什么没有 for 循环它可以正常工作?
  • 因为没有 for 循环,col 仍然是 spark sql 函数。
  • 但在for循环内部,col被迭代变量for col in df.columns覆盖
  • 是的,你明白了
  • 我想死,谢谢你的帮助。去年我一直在使用 node,忘记了上下文函数可以像那样被覆盖
猜你喜欢
  • 2015-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-26
相关资源
最近更新 更多