【问题标题】:Recursively reorder dataframe columns for arbitrary number of dataframes为任意数量的数据帧递归地重新排序数据帧列
【发布时间】:2020-12-30 23:34:36
【问题描述】:

我希望对可变数量的 PySpark 数据帧的列进行重新排序(它们具有相同的列,但顺序不同)。 只要所有数据帧最终具有彼此相同的顺序,决定顺序的数据帧就无关紧要。 下面的函数适用于 2 个数据帧,我的问题是:这如何推广到任意数量的数据帧(2、3 等)?

def reorder_cols(df_1, df_2):
    """Reorder dataframe columns in df_1 based on order of columns in df_2."""
    return df_1.select(df_2.schema.names)

我尝试过使用functools.reduce 并将函数签名定义为*dfs,但我不确定如何从这里开始:

from functools import reduce

def reorder_cols_r(*dfs):
    """Reorder dataframe columns recursively."""
    return reduce(DataFrame.select, dfs)

我正在使用的一些测试数据:

# Test dataframes
df1 = spark.createDataFrame([(1, "foo1"), (2, "bar1")], ("a", "b"))
df2 = spark.createDataFrame([("foo2", 3), ("bar2", 4)], ("b", "a"))
df3 = spark.createDataFrame([(5, "foo3"), (6, "bar3")], ("a", "b"))

然后会以这种方式调用该函数:

reorder_cols_r(*[df1, df2, df3])

注意:应该适用于任意数量的列,只要它们存在于所有数据框中。为简单起见,上面仅使用了 2 列。

【问题讨论】:

    标签: python dataframe apache-spark pyspark apache-spark-sql


    【解决方案1】:

    您可能正在寻找地图:

    def reorder_cols_r(dfs):
        return list(map(lambda x: x.select(dfs[0].columns), dfs))
    

    你可以调用它

    new_dfs = reorder_cols_r([df1, df2, df3])
    

    得到的dfs是:

    >>> [x.show() for x in new_dfs]
    +---+----+
    |  a|   b|
    +---+----+
    |  1|foo1|
    |  2|bar1|
    +---+----+
    
    +---+----+
    |  a|   b|
    +---+----+
    |  3|foo2|
    |  4|bar2|
    +---+----+
    
    +---+----+
    |  a|   b|
    +---+----+
    |  5|foo3|
    |  6|bar3|
    +---+----+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多