web-dev-qa-db-ja.com

Pyspark Dataframeで列を選択する

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|
13
Nivi

次のようなものを試してください:

df.select([c for c in df.columns if c in ['_2','_4','_5']]).show()
29
MaxU

最初の2列と5行

 df.select(df.columns[:2]).take(5)
16
Michael West

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
4
desertnaut

ss.csvのデータセットには、興味のある列がいくつか含まれています。

ss_ = spark.read.csv("ss.csv", header= True, 
                      inferSchema = True)
ss_.columns
['Reporting Area', 'MMWR Year', 'MMWR Week', 'Salmonellosis (excluding Paratyphoid fever andTyphoid fever)†, Current week', 'Salmonellosis (excluding Paratyphoid fever andTyphoid fever)†, Current week, flag', 'Salmonellosis (excluding Paratyphoid fever andTyphoid fever)†, Previous 52 weeks Med', 'Salmonellosis (excluding Paratyphoid fever andTyphoid fever)†, Previous 52 weeks Med, flag', 'Salmonellosis (excluding Paratyphoid fever andTyphoid fever)†, Previous 52 weeks Max', 'Salmonellosis (excluding Paratyphoid fever andTyphoid fever)†, Previous 52 weeks Max, flag', 'Salmonellosis (excluding Paratyphoid fever andTyphoid fever)†, Cum 2018', 'Salmonellosis (excluding Paratyphoid fever andTyphoid fever)†, Cum 2018, flag', 'Salmonellosis (excluding Paratyphoid fever andTyphoid fever)†, Cum 2017', 'Salmonellosis (excluding Paratyphoid fever andTyphoid fever)†, Cum 2017, flag', 'Shiga toxin-producing Escherichia coli, Current week', 'Shiga toxin-producing Escherichia coli, Current week, flag', 'Shiga toxin-producing Escherichia coli, Previous 52 weeks Med', 'Shiga toxin-producing Escherichia coli, Previous 52 weeks Med, flag', 'Shiga toxin-producing Escherichia coli, Previous 52 weeks Max', 'Shiga toxin-producing Escherichia coli, Previous 52 weeks Max, flag', 'Shiga toxin-producing Escherichia coli, Cum 2018', 'Shiga toxin-producing Escherichia coli, Cum 2018, flag', 'Shiga toxin-producing Escherichia coli, Cum 2017', 'Shiga toxin-producing Escherichia coli, Cum 2017, flag', 'Shigellosis, Current week', 'Shigellosis, Current week, flag', 'Shigellosis, Previous 52 weeks Med', 'Shigellosis, Previous 52 weeks Med, flag', 'Shigellosis, Previous 52 weeks Max', 'Shigellosis, Previous 52 weeks Max, flag', 'Shigellosis, Cum 2018', 'Shigellosis, Cum 2018, flag', 'Shigellosis, Cum 2017', 'Shigellosis, Cum 2017, flag']

しかし、私はほんの数が必要です:

columns_lambda = lambda k: k.endswith(', Current week') or k == 'Reporting Area' or k == 'MMWR Year' or  k == 'MMWR Week'

フィルターは目的の列のリストを返し、リストが評価されます。

sss = filter(columns_lambda, ss_.columns)
to_keep = list(sss)

目的の列のリストは、リスト内の列のみを含むデータセットを返すデータフレーム選択関数の引数としてアンパックされます。

dfss = ss_.select(*to_keep)
dfss.columns

結果:

['Reporting Area',
 'MMWR Year',
 'MMWR Week',
 'Salmonellosis (excluding Paratyphoid fever andTyphoid fever)†, Current week',
 'Shiga toxin-producing Escherichia coli, Current week',
 'Shigellosis, Current week']

df.select()には補完的なペアがあります: http://spark.Apache.org/docs/2.4.1/api/python/pyspark.sql.html#pyspark.sql.DataFrame.drop =

列のリストをドロップします。

1
borodark

配列を使用して、select内で展開できます。

cols = ['_2','_4','_5']
df.select(*cols).show()
0
Shadowtrooper

まず、MySQLまたは他のデータベースからインポートするときに、スキーマがエラーによって作成されます。辞書カーソルを使用して変更できます

cursor = conn.cursor(MySQLdb.cursors.DictCursor)
0
Shekhar Koirala