如何过滤同一类型的所有DataFrame列与单个请求?



我有一个带有±240个日期和时间戳字段的大型DataFrame。字段是可空的、嵌套的、嵌套在数组中的。我想找到所有日期或时间戳值小于或大于X的列名。如何用单个请求做到这一点?

# DataFrame
name: Evgenii, born: 1998, father: [name: Ivan, born: 1970], wtf: [foo: bar, omg: [2000, 2001, 2022]]
name: Ivan, born: 1970, father: [name: Vasilii, born: 1940]
name: Vasilii, born: 1940, father: [name: Pavel, born: 1917]
# filter all columns with dates lt 1950 gives:
born, father.born
# filter all columns with dates lt 1920 gives:
father.born
# filter all columns with dates gt 1990 gives:
born, wtf.omg
(request must not contain column names)

这里有一些帮助来实现这一点,但不是完整的代码。

所以在数据框架的顶层获取数据类型是很容易的。这将很容易搜索日期或时间戳。

打印(df.schema["name" .dataType)

如果你想探索一个结构模式,你需要一个小技巧来获得它们:

df.select("父亲。*"). schema("name"

请参阅此链接,了解如何删除null值的列。


# Sample data df = pd.DataFrame({'x1': ['a', '1', '2'],
'x2': ['b', None, '2'],
'x3': ['c', '0', '3'] }) df = sqlContext.createDataFrame(df) df.show()
def drop_null_columns(df):
"""
This function drops all columns which contain null values.
:param df: A PySpark DataFrame
"""
null_counts = df.select([F.count(F.when(F.col(c).isNull(), c)).alias(c) for c in df.columns]).collect()[0].asDict()
to_drop = [k for k, v in null_counts.items() if v > 0]
df = df.drop(*to_drop)
return df
# Drops column b2, because it contains null values drop_null_columns(df).show() ```

最新更新