通过Pyspark DataFrame列进行迭代



我有以下pyspark.dataframe

age  state  name    income
21    DC    john    30-50K
NaN   VA    gerry   20-30K

我正在尝试实现产生的 df.isnull().sum()(来自熊猫)的等效物:

age      1
state    0
name     0
income   0

首先,我尝试了以下内容:

null_counter = [df[c].isNotNull().count() for c in df.columns]

,但这会产生以下错误:

TypeError: Column is not iterable

同样,这就是我当前在列上迭代以获取最低值的方式:

class BaseAnalyzer:
    def __init__(self, report, struct):
        self.report = report
        self._struct = struct
        self.name = struct.name
        self.data_type = struct.dataType
        self.min = None
        self.max = None
    def __repr__(self):
        return '<Column: %s>' % self.name

class BaseReport:
    def __init__(self, df):
        self.df = df
        self.columns_list = df.columns
        self.columns = {f.name: BaseAnalyzer(self, f) for f in df.schema.fields}
    def calculate_stats(self):
        find_min = self.df.select([fn.min(self.df[c]).alias(c) for c in self.df.columns]).collect()
        min_row = find_min[0]
        for column, min_value in min_row.asDict().items():
            self[column].min = min_value
    def __getitem__(self, name):
        return self.columns[name]
    def __repr__(self):
        return '<Report>'
report = BaseReport(df)
calc = report.calculate_stats()
for column in report1.columns.values():
if hasattr(column, 'min'):
    print("{}:{}".format(column, column.min))

,我可以"迭代列"

<Column: age>:1
<Column: name>: Alan
<Column: state>:ALASKA
<Column: income>:0-1k

我认为这种方法已成为复杂的方式,我如何在所有列上正确迭代以提供Vaiour摘要statistcs(Min,Max,Max,Isnull,Notnull等)。pyspark.sql.Rowpyspark.sql.Column之间的区别似乎来自Pandas。

您是否尝试过这样的事情:

names = df.schema.names
for name in names:
    print(name + ': ' + df.where(df[name].isNull()).count())

您可以看到如何将其修改以将信息放入字典或其他一些更有用的格式中。

您可以尝试一下:

nullDf= df.select([count(when(col(c).isNull(), c)).alias(c) for c in df.columns]) 
nullDf.show() 

它将为您提供带有null值的null值数的列列表。

相关内容

  • 没有找到相关文章

最新更新