在Pyspark Dataframe中选择列

Niv*_*ivi 15 python apache-spark apache-spark-sql pyspark pyspark-sql

我正在寻找一种方法来在pyspark中选择我的数据帧的列.对于第一行,我知道我可以使用df.first()但不确定列,因为它们没有列名.

我有5列,想要遍历每一列.

+--+---+---+---+---+---+---+
|_1| _2| _3| _4| _5| _6| _7|
+--+---+---+---+---+---+---+
|1 |0.0|0.0|0.0|1.0|0.0|0.0|
|2 |1.0|0.0|0.0|0.0|0.0|0.0|
|3 |0.0|0.0|1.0|0.0|0.0|0.0|
Run Code Online (Sandbox Code Playgroud)

Max*_*axU 31

尝试这样的事情:

df.select([c for c in df.columns if c in ['_2','_4','_5']]).show()
Run Code Online (Sandbox Code Playgroud)


Sha*_*per 22

您可以使用数组并将其解压缩到选择中:

cols = ['_2','_4','_5']
df.select(*cols).show()
Run Code Online (Sandbox Code Playgroud)

  • @yeliabsalohcin * 运算符用于解压缩数组。Pysparks select 函数不接受数组。 (3认同)
  • 如果您有“.”等特殊字符,请小心 在你的列名中,然后你用反引号“`”包围每个字符串 (2认同)

Mic*_*est 17

前两列五行

 df.select(df.columns[:2]).take(5)
Run Code Online (Sandbox Code Playgroud)


Myk*_*tko 7

该方法select接受列名(字符串)或表达式(Column)列表作为参数。要选择列,您可以使用:

-- 列名称(字符串):

df.select('col_1','col_2','col_3')
Run Code Online (Sandbox Code Playgroud)

-- 列对象:

import pyspark.sql.functions as F

df.select(F.col('col_1'), F.col('col_2'), F.col('col_3'))

# or

df.select(df.col_1, df.col_2, df.col_3)

# or

df.select(df['col_1'], df['col_2'], df['col_3'])
Run Code Online (Sandbox Code Playgroud)

-- 列名称或列对象的列表:

df.select(*['col_1','col_2','col_3'])

#or

df.select(*[F.col('col_1'), F.col('col_2'), F.col('col_3')])

#or 

df.select(*[df.col_1, df.col_2, df.col_3])
Run Code Online (Sandbox Code Playgroud)

星号运算符*可以省略,因为它用于与其他函数保持一致,例如drop不接受列表作为参数的函数。


des*_*aut 5

使用df.schema.names

spark.version
# u'2.2.0'

df = spark.createDataFrame([("foo", 1), ("bar", 2)])
df.show()
# +---+---+ 
# | _1| _2|
# +---+---+
# |foo|  1| 
# |bar|  2|
# +---+---+

df.schema.names
# ['_1', '_2']

for i in df.schema.names:
  # df_new = df.withColumn(i, [do-something])
  print i
# _1
# _2
Run Code Online (Sandbox Code Playgroud)