在指定位置插入列

问题描述 投票:0回答:1

如何在指定位置插入列而不列出所有现有列名?

我有这个数据框:

from pyspark.sql import functions as F

df = spark.range(1).select(
    F.lit(11).alias('a'),
    F.lit(22).alias('b'),
    F.lit(33).alias('c'),
)
df.show()
# +---+---+---+
# |  a|  b|  c|
# +---+---+---+
# | 11| 22| 33|
# +---+---+---+

我想在列之后插入一列

a

我知道我可以按照我喜欢的顺序列出所有列:

df.select('a', F.lit('foo'), 'b', 'c')

但是我想插入一列而不列出现有的列名称。

dataframe apache-spark pyspark apache-spark-sql position
1个回答
0
投票

这样的东西可以工作:

position = 1
cols = df.columns
df = df.select(*cols[:position], F.lit('foo'), *cols[position:])

df.show()
# +---+---+---+---+
# |  a|foo|  b|  c|
# +---+---+---+---+
# | 11|foo| 22| 33|
# +---+---+---+---+

可以创建插入或移动列的函数:

def insert_col(df, position, col_name, col_expr=None):
    cols = [c for c in df.columns if c != col_name]
    col = F.col(col_name) if col_expr is None else col_expr
    df = df.select(*cols[:position], col.alias(col_name), *cols[position:])
    return df

df = insert_col(df, 1, 'foo', F.lit('bar'))
df.show()
# +---+---+---+---+
# |  a|foo|  b|  c|
# +---+---+---+---+
# | 11|bar| 22| 33|
# +---+---+---+---+
df = insert_col(df, 0, 'c')
df.show()
# +---+---+---+
# |  c|  a|  b|
# +---+---+---+
# | 33| 11| 22|
# +---+---+---+
© www.soinside.com 2019 - 2024. All rights reserved.