次の_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
_の違いパンダから来て奇妙なようです。
次のようなことを試しましたか?
names = df.schema.names
for name in names:
print(name + ': ' + df.where(df[name].isNull()).count())
これを変更して、情報をディクショナリまたはその他のより便利な形式に入れる方法を確認できます。