web-dev-qa-db-ja.com

pysparkデータフレーム列を反復する

次の_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
_

この方法は複雑になっていると思いますが、どのようにすべての列を適切に繰り返して、要約統計(最小値、最大値、isnull、notnullなど)を提供できますか。_pyspark.sql.Row_と_pyspark.sql.Column_の違いパンダから来て奇妙なようです。

5

次のようなことを試しましたか?

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

これを変更して、情報をディクショナリまたはその他のより便利な形式に入れる方法を確認できます。

7
Grr