小编yoe*_*oel的帖子

Python中导入的类函数中的全局变量

我试图将代码分散到单独的文件中以提高可读性,并且遇到了在导入的文件中引用未定义的全局名称的麻烦。是否有比调用时将所有必要的值有意传递给函数更好的解决方案?

我的代码当前是这样的:

#foo.py

import bar

def main():
    a = 1
    b = bar.Bar()
    while True:
        a += 1
        b.incr()
        print a
        print b.c

if __name__ == '__main__':
    main()

#END foo.py
Run Code Online (Sandbox Code Playgroud)

--

#bar.py

class Bar:
    def __init__(self):
        self.c = 0
    def incr(self):
        self.c += a

#END bar.py
Run Code Online (Sandbox Code Playgroud)

它给我NameError:全局名称'a'未定义。我需要像这样重写main():

def main():
        b = new bar.Bar()
        while True:
            a += 1
            b.incr(a)
            print a
            print b.c
Run Code Online (Sandbox Code Playgroud)

然后像这样重写incr():

def incr(self,a):
            c += a
Run Code Online (Sandbox Code Playgroud)

或者,还有更好的方法?

作为记录,上面的代码被大量抽象。实际的代码包含大量的类和函数,这些类和函数传递许多类型的变量,包括一些大型词典。

提前致谢!

python global-variables python-2.7

4
推荐指数
1
解决办法
2893
查看次数

在DataFrame.withColumn中,如何使用列的值作为第二个参数的条件?

如果我有一个名为df的DataFrame看起来像:

+---+---+
| a1+ a2|
+---+---+
|foo|bar|
|N/A|baz|
+---+---+
Run Code Online (Sandbox Code Playgroud)

我期望从:

val df2 = df.withColumn("a1", when($"a1" == "N/A", $"a2))
Run Code Online (Sandbox Code Playgroud)

df2看起来像:

+---+---+
| a1+ a2|
+---+---+
|foo|bar|
|baz|baz|
+---+---+
Run Code Online (Sandbox Code Playgroud)

但是我得到了:

error: type mismatch;
 found   : Boolean
 required: org.apache.spark.sql.Column
Run Code Online (Sandbox Code Playgroud)

因此,听起来我需要一个在DataFrame的withColumn方法中产生其值的Column方法。

有任何类似的事情,或者其他方法来用当前列的值有条件地填充withColumn的替换参数吗?

scala dataframe apache-spark apache-spark-sql

1
推荐指数
1
解决办法
3485
查看次数

在DataFrame.withColumn中,如何检查列的值是否为空作为第二个参数的条件?

如果我有一个名为df的DataFrame看起来像:

+----+----+
|  a1+  a2|
+----+----+
| foo| bar|
| N/A| baz|
|null| etc|
+----+----+
Run Code Online (Sandbox Code Playgroud)

我可以像这样有选择地替换值:

val df2 = df.withColumn("a1", when($"a1" === "N/A", $"a2"))
Run Code Online (Sandbox Code Playgroud)

所以df2看起来像:

+----+----+
|  a1+  a2|
+----+----+
| foo| bar|
| baz| baz|
|null| etc|
+----+----+
Run Code Online (Sandbox Code Playgroud)

但是为什么我不能检查它是否为null,例如:

val df3 = df2.withColumn("a1", when($"a1" === null, $"a2"))
Run Code Online (Sandbox Code Playgroud)

这样我得到:

+----+----+
|  a1+  a2|
+----+----+
| foo| bar|
| baz| baz|
| etc| etc|
+----+----+
Run Code Online (Sandbox Code Playgroud)

编辑:$“ a1” .isNull似乎不起作用。可能是因为我如何构造用于测试的数据框,如下所示?

val schema = StructType(
                StructField("a1", StringType, false) ::
                StructField("a2", StringType, false) :: Nil …
Run Code Online (Sandbox Code Playgroud)

scala dataframe apache-spark apache-spark-sql spark-dataframe

0
推荐指数
1
解决办法
3450
查看次数