pyspark入門系列 - 03 pyspark.sql.DataFrame函數彙總與實踐

先放上pyspark.sql.DataFrame的函數彙總
在這裏插入圖片描述

from pyspark.sql import SparkSession
spark = SparkSession.Builder().master('local').appName('learnDataFrame').getOrCreate()

從文件中讀取數據,創建DataFrame

df = spark.read.csv('../data/data.csv', header='True')
# 查看各個列的數據類型
df.printSchema()
root
 |-- _c0: string (nullable = true)
 |-- 對手: string (nullable = true)
 |-- 勝負: string (nullable = true)
 |-- 主客場: string (nullable = true)
 |-- 命中: string (nullable = true)
 |-- 投籃數: string (nullable = true)
 |-- 投籃命中率: string (nullable = true)
 |-- 3分命中率: string (nullable = true)
 |-- 籃板: string (nullable = true)
 |-- 助攻: string (nullable = true)
 |-- 得分: string (nullable = true)

from pyspark.sql.types import IntegerType, FloatType

# withColumns: 爲DataFrame增加新的列,如果列名存在,則替換已存在的列
df = df.withColumn('命中', df['命中'].cast(IntegerType()))
df = df.withColumn('投籃數', df['投籃數'].cast(IntegerType()))
df = df.withColumn('投籃命中率', df['投籃命中率'].cast(FloatType()))
df = df.withColumn('3分命中率', df['3分命中率'].cast(FloatType()))
df = df.withColumn('籃板', df['籃板'].cast(IntegerType()))
df = df.withColumn('助攻', df['助攻'].cast(IntegerType()))
df = df.withColumn('得分', df['得分'].cast(IntegerType()))

df.printSchema()
root
 |-- _c0: string (nullable = true)
 |-- 對手: string (nullable = true)
 |-- 勝負: string (nullable = true)
 |-- 主客場: string (nullable = true)
 |-- 命中: integer (nullable = true)
 |-- 投籃數: integer (nullable = true)
 |-- 投籃命中率: float (nullable = true)
 |-- 3分命中率: float (nullable = true)
 |-- 籃板: integer (nullable = true)
 |-- 助攻: integer (nullable = true)
 |-- 得分: integer (nullable = true)

# 打印數據的2行
df.show(2)
+---+----+----+------+----+------+----------+---------+----+----+----+
|_c0|對手|勝負|主客場|命中|投籃數|投籃命中率|3分命中率|籃板|助攻|得分|
+---+----+----+------+----+------+----------+---------+----+----+----+
|  0|勇士|  勝|    客|  10|    23|     0.435|    0.444|   6|  11|  27|
|  1|國王|  勝|    客|   8|    21|     0.381|    0.286|   3|   9|  27|
+---+----+----+------+----+------+----------+---------+----+----+----+
only showing top 2 rows

df.explain

<bound method DataFrame.explain of DataFrame[_c0: string, 對手: string, 勝負: string, 主客場: string, 命中: int, 投籃數: int, 投籃命中率: float, 3分命中率: float, 籃板: int, 助攻: int, 得分: int]>

agg

聚合函數,等價於pandas中的df.groupby().agg()

# 求得分的均值
ans = df.agg({'得分': 'mean'}).collect()
ans

[Row(avg(得分)=32.04)]

alias

返回帶有別名集的新DataFrame。

df2 = df.alias('df1')

approxQuantile

計算DataFrame的數字列的近似分位數

quantile_25 = df.approxQuantile('得分', (0.25, ), 0.01)
quantile_25

[27.0]

df.coalesce(numPartitions=1)

DataFrame[_c0: string, 對手: string, 勝負: string, 主客場: string, 命中: int, 投籃數: int, 投籃命中率: float, 3分命中率: float, 籃板: int, 助攻: int, 得分: int]

# 查看DataFrame所有的列名
df.columns

['_c0', '對手', '勝負', '主客場', '命中', '投籃數', '投籃命中率', '3分命中率', '籃板', '助攻', '得分']

corr(col1, col2, method=None)

計算兩個數值型列的相關性,目前僅支持persion相關係數。

# 計算3分命中率 和 得分的相關性
df.corr('3分命中率', '得分')

0.776918459184134

count()

返回DataFrame的行數

df.count()

25

cov(col1, col2)

計算兩個指定列的協方差,與DataFrameStatFunctions.cov()相同

df.cov('3分命中率', '得分')

1.0428483147422474

createGlobalTempView(name)

創建全局臨時視圖,此臨時視圖的生命週期與此Spark應用程序相關,如果已經存在同名的視圖,則拋出 TempTableAlreadyExistsException

df.createGlobalTempView('df')

createOrReplaceGlobalTempView(name)

創建全局臨時視圖,如果存在同名視圖,則替換同名視圖,視圖生命週期與Spark應用程序相關

df.createOrReplaceGlobalTempView('df')

createOrReplaceTempView(name)

創建局部臨時視圖,該臨時表的生命週期與SparkSession綁定在一起

df.createOrReplaceTempView('df')

createTempView(name)

創建局部臨時視圖,該臨時表的生命週期與SparkSession綁定在一起,如果已經存在同名的視圖,則拋出 TempTableAlreadyExistsException

df.createTempView('df')

crossJoin()

返回兩個DataFrame的笛卡爾積

df.columns


['_c0', '對手', '勝負', '主客場', '命中', '投籃數', '投籃命中率', '3分命中率', '籃板', '助攻', '得分']

df1 = df.select('_c0', '對手')
df2 = df.select('_c0', '勝負')
df_crossjoin = df1.crossJoin(df2)
df_crossjoin.show(10)

+---+----+---+----+
|_c0|對手|_c0|勝負|
+---+----+---+----+
|  0|勇士|  0|  勝|
|  0|勇士|  1|  勝|
|  0|勇士|  2|  勝|
|  0|勇士|  3|  負|
|  0|勇士|  4|  勝|
|  0|勇士|  5|  勝|
|  0|勇士|  6|  負|
|  0|勇士|  7|  負|
|  0|勇士|  8|  勝|
|  0|勇士|  9|  勝|
+---+----+---+----+
only showing top 10 rows

crosstab(col1, col2)

計算給定列的成對頻率表

cube(*cols)

使用指定的列爲當前DataFrame創建多維多維數據集,因此我們可以在它們上運行聚合

describe(*cols)

計算數字和字符串列的統計信息

df.describe(['對手', '命中', '投籃數']).show()

+-------+----+------------------+------------------+
|summary|對手|              命中|            投籃數|
+-------+----+------------------+------------------+
|  count|  25|                25|                25|
|   mean|null|               9.8|             21.16|
| stddev|null|3.0138568866708537|3.3501243758005956|
|    min|76人|                 6|                15|
|    max|黃蜂|                19|                29|
+-------+----+------------------+------------------+

distinct()

按行去重,返回去重後的DataFrame

tmp_df = df.select(['主客場', '命中']).distinct()
tmp_df.show()

+------+----+
|主客場|命中|
+------+----+
|    客|  16|
|    客|  10|
|    主|  10|
|    客|  12|
|    主|   8|
|    客|   9|
|    客|   6|
|    主|  11|
|    主|   6|
|    客|  13|
|    客|   8|
|    主|  13|
|    主|  12|
|    主|  19|
+------+----+

drop(*cols)

刪除指定的行,返回刪除後的DataFrame

df1 = df.alias('df1')
df1 = df1.drop('命中', '得分')

df1.show(2)

+---+----+----+------+------+----------+-------------------+----+----+
|_c0|對手|勝負|主客場|投籃數|投籃命中率|          3分命中率|籃板|助攻|
+---+----+----+------+------+----------+-------------------+----+----+
|  0|勇士|  勝|    客|    23|     0.435|              0.444|   6|  11|
|  1|國王|  勝|    客|    21|     0.381|0.28600000000000003|   3|   9|
+---+----+----+------+------+----------+-------------------+----+----+
only showing top 2 rows

df.show(2)

+---+----+----+------+----+------+----------+-------------------+----+----+----+
|_c0|對手|勝負|主客場|命中|投籃數|投籃命中率|          3分命中率|籃板|助攻|得分|
+---+----+----+------+----+------+----------+-------------------+----+----+----+
|  0|勇士|  勝|    客|  10|    23|     0.435|              0.444|   6|  11|  27|
|  1|國王|  勝|    客|   8|    21|     0.381|0.28600000000000003|   3|   9|  27|
+---+----+----+------+----+------+----------+-------------------+----+----+----+
only showing top 2 rows

dropDuplicates(subset=None)

返回刪除重複行的DataFrame,可以考慮只根據某些行去重。與drop_Duplicates()功能相同

df1 = df.dropDuplicates(subset=['勝負', '主客場'])
df1.show()

+---+----+----+------+----+------+----------+---------+----+----+----+
|_c0|對手|勝負|主客場|命中|投籃數|投籃命中率|3分命中率|籃板|助攻|得分|
+---+----+----+------+----+------+----------+---------+----+----+----+
|  0|勇士|  勝|    客|  10|    23|     0.435|    0.444|   6|  11|  27|
|  6|灰熊|  負|    客|   6|    19|     0.316|    0.222|   4|   8|  20|
|  3|灰熊|  負|    主|   8|    20|       0.4|     0.25|   5|   8|  22|
|  2|小牛|  勝|    主|  10|    19|     0.526|    0.462|   3|   7|  29|
+---+----+----+------+----+------+----------+---------+----+----+----+

dropna(how=‘any’, thresh=None, subset=None)

返回刪除含有空值的行,別名DataFrameNaFunctions.drop()
how: any, 刪除包含空的行
all, 刪除全部爲空的行、
thresh: 默認爲空,如果指定的話,刪除小閾值且非空的行

import numpy as np
import pandas as pd
tmp_df = spark.createDataFrame(pd.DataFrame({'a': [1, 2, np.nan], 'b': [2, np.nan, 5]}))
tmp_df.show()

+---+---+
|  a|  b|
+---+---+
|1.0|2.0|
|2.0|NaN|
|NaN|5.0|
+---+---+

tmp_df.dropna(how='any').show()

+---+---+
|  a|  b|
+---+---+
|1.0|2.0|
+---+---+

dtypes

返回列表類型,包含所有列的列名和他們的數據類型

df.dtypes

[('_c0', 'string'),
 ('對手', 'string'),
 ('勝負', 'string'),
 ('主客場', 'string'),
 ('命中', 'string'),
 ('投籃數', 'string'),
 ('投籃命中率', 'string'),
 ('3分命中率', 'string'),
 ('籃板', 'string'),
 ('助攻', 'string'),
 ('得分', 'string')]

explain(extended=False)

將(邏輯和物理)計劃打印到控制檯以進行調試

df.explain(extended=False)

== Physical Plan ==
*(1) FileScan csv [_c0#2232,對手#2233,勝負#2234,主客場#2235,命中#2236,投籃數#2237,投籃命中率#2238,3分命中率#2239,籃板#2240,助攻#2241,得分#2242] Batched: false, Format: CSV, Location: InMemoryFileIndex[file:/D:/demo/studyProj/spark/data/data.csv], PartitionFilters: [], PushedFilters: [], ReadSchema: struct<_c0:string,對手:string,勝負:string,主客場:string,命中:string,投籃數:string,投籃命中率:string,3分命中率:string,籃...

fillna(value, subset=None)

填充缺失值,別名na.fill().DataFrame.fillna()和DataFrameNaFunctions.fill()。

value: int,long, float, string. or dict, 如果爲字典類型,則key爲列名,value爲對應列的填充值

subset:可選的列名

tmp_df = spark.createDataFrame(pd.DataFrame({'a': [1, 2, np.nan], 'b': [2, np.nan, 5]}))
tmp_df.fillna({'a': 100, 'b': 200}).show()

+-----+-----+
|    a|    b|
+-----+-----+
|  1.0|  2.0|
|  2.0|200.0|
|100.0|  5.0|
+-----+-----+

filter(condition)

根據給定的條件過濾行,與where()功能相同

df.filter(df['命中'] > 15).show()

+---+------+----+------+----+------+----------+------------------+----+----+----+
|_c0|  對手|勝負|主客場|命中|投籃數|投籃命中率|         3分命中率|籃板|助攻|得分|
+---+------+----+------+----+------+----------+------------------+----+----+----+
| 10|  爵士|  勝|    主|  19|    25|      0.76|             0.875|   2|  13|  56|
| 23|開拓者|  勝|    客|  16|    29|     0.552|0.5710000000000001|   8|   3|  48|
+---+------+----+------+----+------+----------+------------------+----+----+----+

df.where(df['命中'] > 15).show()

+---+------+----+------+----+------+----------+------------------+----+----+----+
|_c0|  對手|勝負|主客場|命中|投籃數|投籃命中率|         3分命中率|籃板|助攻|得分|
+---+------+----+------+----+------+----------+------------------+----+----+----+
| 10|  爵士|  勝|    主|  19|    25|      0.76|             0.875|   2|  13|  56|
| 23|開拓者|  勝|    客|  16|    29|     0.552|0.5710000000000001|   8|   3|  48|
+---+------+----+------+----+------+----------+------------------+----+----+----+

first()

返回第一行作爲一個Row

t = df.first()
type(t)

pyspark.sql.types.Row

foreach(f)

對DataFrame的所有行執行函數操作,等價於df.rdd.foreach()

foreachPartition(f)

將f函數應用於此DataFrame的每個分區。

freqItems(cols, support=None)

查找列的頻繁項

cols: 要計算重複項的列名,爲字符串類型的列表或者元祖。

support: 要計算頻率項的頻率值。默認是1%。參數必須大於1e-4.

df.freqItems(cols=['命中', '主客場'], support=0.9).show()

+--------------+----------------+
|命中_freqItems|主客場_freqItems|
+--------------+----------------+
|           [8]|            [客]|
+--------------+----------------+

groupBy(*cols)

按指定列分組,後面可以執行aggregation函數,等價於groupby()

df.groupBy(['主客場', '勝負']).agg({'得分': 'sum', '對手': 'count'}).show()

+------+----+---------+-----------+
|主客場|勝負|sum(得分)|count(對手)|
+------+----+---------+-----------+
|    主|  負|     89.0|          3|
|    客|  勝|    384.0|         12|
|    主|  勝|    308.0|          9|
|    客|  負|     20.0|          1|
+------+----+---------+-----------+

head(n=None)

返回DataFrame的前n行

df.head(3)

[Row(_c0='0', 對手='勇士', 勝負='勝', 主客場='客', 命中='10', 投籃數='23', 投籃命中率='0.435', 3分命中率='0.444', 籃板='6', 助攻='11', 得分='27'),
 Row(_c0='1', 對手='國王', 勝負='勝', 主客場='客', 命中='8', 投籃數='21', 投籃命中率='0.381', 3分命中率='0.28600000000000003', 籃板='3', 助攻='9', 得分='27'),
 Row(_c0='2', 對手='小牛', 勝負='勝', 主客場='主', 命中='10', 投籃數='19', 投籃命中率='0.526', 3分命中率='0.462', 籃板='3', 助攻='7', 得分='29')]

intersect(other)

返回兩個DataFrame交集組成的DataFrame

join(other, on=None, how=None)

根據指定列,用指定方法連接兩個DataFrame

limit(num)

將結果計數限制爲指定的數量

df.limit(3).show()

+---+----+----+------+----+------+----------+-------------------+----+----+----+
|_c0|對手|勝負|主客場|命中|投籃數|投籃命中率|          3分命中率|籃板|助攻|得分|
+---+----+----+------+----+------+----------+-------------------+----+----+----+
|  0|勇士|  勝|    客|  10|    23|     0.435|              0.444|   6|  11|  27|
|  1|國王|  勝|    客|   8|    21|     0.381|0.28600000000000003|   3|   9|  27|
|  2|小牛|  勝|    主|  10|    19|     0.526|              0.462|   3|   7|  29|
+---+----+----+------+----+------+----------+-------------------+----+----+----+

orderBy(*cols, **kwargs)

根據指定列排序,返回排好序的DataFrame

cols:用來排序的列或列名稱的列表。

ascending:布爾值或布爾值列表(默認 True). 升序排序與降序排序。指定多個排序順序的列表。如果指定列表, 列表的長度必須等於列的長度

# 按得分降序,投籃數升序排列
df.orderBy(['得分', '投籃數'], ascending=[False, True]).show(5)

+---+------+----+------+----+------+----------+------------------+----+----+----+
|_c0|  對手|勝負|主客場|命中|投籃數|投籃命中率|         3分命中率|籃板|助攻|得分|
+---+------+----+------+----+------+----------+------------------+----+----+----+
| 10|  爵士|  勝|    主|  19|    25|      0.76|             0.875|   2|  13|  56|
| 15|  太陽|  勝|    客|  12|    22|     0.545|             0.545|   2|   7|  48|
| 23|開拓者|  勝|    客|  16|    29|     0.552|0.5710000000000001|   8|   3|  48|
| 12|  灰熊|  勝|    主|  11|    25|      0.44|             0.429|   4|   8|  38|
| 14|  猛龍|  負|    主|   8|    25|      0.32|             0.273|   6|  11|  38|
+---+------+----+------+----+------+----------+------------------+----+----+----+
only showing top 5 rows

persist(storageLevel=StorageLevel(True, True, False, False, 1))

設置存儲級別以在第一次操作運行完成後保存其值,默認爲(memory_only_ser)

randomSplit(weights, seed=None)

根據給定的權重隨機劃分DataFrame

splits = df.randomSplit(weights=[0.2, 0.8], seed=7)
for s in splits:
    print(s.count())

3
22

rdd

以Row的pyspark.RDD形式返回內容。

rdd = df.rdd
type(rdd)

pyspark.rdd.RDD

registerTempTable(name)

使用給定名稱將此RDD註冊爲臨時表

此臨時表的生存期與用於創建此DataFrame的SQLContext綁定在一起

df.registerTempTable('table')
df1 = spark.sql("select '對手','勝負' from table")    # 
df1.show(5)

+----+----+
|對手|勝負|
+----+----+
|對手|勝負|
|對手|勝負|
|對手|勝負|
|對手|勝負|
|對手|勝負|
+----+----+
only showing top 5 rows

repartition(numPartitions, *cols)

按照給定的分區表達式分區,返回新的DataFrame。
產生的DataFrame是哈希分區。

numPartitions參數可以是一個整數來指定分區數,或者是一個列。如果是一個列,這個列會作爲第一個分區列。如果沒有指定,將使用默認的分區數。

replace(to_replace, value=None, subset=None)

返回用另外一個值替換了一個值的新的DataFrame。DataFrame.replace() 和 DataFrameNaFunctions.replace() 類似

rollup(*cols)

使用指定的列爲當前的DataFrame創建一個多維彙總,這樣可以聚合這些數據。

sample(withReplacement, fraction, seed=None)

返回DataFrame的子集採樣

df.sample(withReplacement=False, fraction=0.4, seed=4).show()

+---+----+----+------+----+------+------------------+-------------------+----+----+----+
|_c0|對手|勝負|主客場|命中|投籃數|        投籃命中率|          3分命中率|籃板|助攻|得分|
+---+----+----+------+----+------+------------------+-------------------+----+----+----+
|  4|76人|  勝|    客|  10|    20|               0.5|               0.25|   3|  13|  27|
|  5|黃蜂|  勝|    客|   8|    18|             0.444|                0.4|  10|  11|  27|
|  9|老鷹|  勝|    客|   8|    15|0.5329999999999999|              0.545|   3|  11|  29|
| 10|爵士|  勝|    主|  19|    25|              0.76|              0.875|   2|  13|  56|
| 15|太陽|  勝|    客|  12|    22|             0.545|              0.545|   2|   7|  48|
| 16|灰熊|  勝|    客|   9|    20|              0.45|                0.5|   5|   7|  29|
| 17|掘金|  勝|    主|   6|    16|             0.375|0.14300000000000002|   8|   9|  21|
| 19|籃網|  勝|    主|  13|    20|              0.65|              0.615|  10|   8|  37|
| 24|鵜鶘|  勝|    主|   8|    16|               0.5|                0.4|   1|  17|  26|
+---+----+----+------+----+------+------------------+-------------------+----+----+----+

sampleBy(col, fractions, seed=None)

根據每個層次上給出的分數,返回沒有替換的分層樣本。

schema

返回DataFrame的schema

df.schema

StructType(List(StructField(_c0,StringType,true),StructField(對手,StringType,true),StructField(勝負,StringType,true),StructField(主客場,StringType,true),StructField(命中,StringType,true),StructField(投籃數,StringType,true),StructField(投籃命中率,StringType,true),StructField(3分命中率,StringType,true),StructField(籃板,StringType,true),StructField(助攻,StringType,true),StructField(得分,StringType,true)))

select(*cols)

根據指定列名返回對應列構成的DataFrame

selectExpr(*expr)

投影一組SQL表達式並返回一個新的DataFrame。

tmp_df.selectExpr("a * 2", "abs(a)").show()

+-------+------+
|(a * 2)|abs(a)|
+-------+------+
|    2.0|   1.0|
|    4.0|   2.0|
|    NaN|   NaN|
+-------+------+

sort(*cols,**kwargs)

根據指定的列排序

df.sort(['得分'], ascending=False).show(10)

+---+------+----+------+----+------+----------+---------+----+----+----+
|_c0|  對手|勝負|主客場|命中|投籃數|投籃命中率|3分命中率|籃板|助攻|得分|
+---+------+----+------+----+------+----------+---------+----+----+----+
| 10|  爵士|  勝|    主|  19|    25|      0.76|    0.875|   2|  13|  56|
| 23|開拓者|  勝|    客|  16|    29|     0.552|    0.571|   8|   3|  48|
| 15|  太陽|  勝|    客|  12|    22|     0.545|    0.545|   2|   7|  48|
| 12|  灰熊|  勝|    主|  11|    25|      0.44|    0.429|   4|   8|  38|
| 14|  猛龍|  負|    主|   8|    25|      0.32|    0.273|   6|  11|  38|
| 19|  籃網|  勝|    主|  13|    20|      0.65|    0.615|  10|   8|  37|
| 18|尼克斯|  勝|    主|  12|    27|     0.444|    0.385|   2|  10|  37|
| 21|  湖人|  勝|    客|  13|    22|     0.591|    0.444|   4|   9|  36|
| 11|  騎士|  勝|    主|   8|    21|     0.381|    0.429|  11|  13|  35|
|  8|尼克斯|  勝|    客|   9|    23|     0.391|    0.353|   5|   9|  31|
+---+------+----+------+----+------+----------+---------+----+----+----+
only showing top 10 rows

sortWithinPartitions(*cols, **kwargs)

每個分區按指定的列排序

stat

返回一個DataFrameStatFunctoins

subtract(other)

subtract(other):返回一個新的DataFrame,這個DataFrame中包含的行不在另一個DataFrame中。這相當於SQL中的EXCEPT

take(num)

返回DataFrame的前num行

sortWithinPartitions(*cols, **kwargs)

返回一個新的DataFrame,每個分區按指定的列排序

summary()

df.select('勝負', '命中', '投籃數').summary('min', 'max', 'count').show()

+-------+----+----+------+
|summary|勝負|命中|投籃數|
+-------+----+----+------+
|    min|  勝|   6|    15|
|    max|  負|  19|    29|
|  count|  25|  25|    25|
+-------+----+----+------+

toDF(*cols)

返回包含指定列的新的DataFrame

ndf = df.select("勝負", "命中", "投籃數").filter(df['投籃數'] == 21).toDF("勝負_", "命中_", "投籃數_")
ndf.show()

+-----+-----+-------+
|勝負_|命中_|投籃數_|
+-----+-----+-------+
|   勝|    8|     21|
|   負|    8|     21|
|   勝|    8|     21|
|   勝|    9|     21|
+-----+-----+-------+

toJSON(use_unicode=True)

將DataFrame轉換爲字符串類型的rdd

df_json = df.select("勝負", "命中", "投籃數").filter(df['投籃數'] == 21).toJSON()
df_json.collect()
['{"勝負":"勝","命中":8,"投籃數":21}',
 '{"勝負":"負","命中":8,"投籃數":21}',
 '{"勝負":"勝","命中":8,"投籃數":21}',
 '{"勝負":"勝","命中":9,"投籃數":21}']

toLocalIterator(prefetchPartitions=False)

返回一個迭代器,該迭代器包含此DataFrame中的所有行

ndf = df.select("勝負", "命中", "投籃數").filter(df['投籃數'] == 21).toLocalIterator()
for row in ndf:
    print(row)
Row(勝負='勝', 命中=8, 投籃數=21)
Row(勝負='負', 命中=8, 投籃數=21)
Row(勝負='勝', 命中=8, 投籃數=21)
Row(勝負='勝', 命中=9, 投籃數=21)

toPandas()

將pyspark DataFrame轉換爲pandas DataFrame

ndf = df.toPandas()
type(ndf)
pandas.core.frame.DataFrame

union(other)

兩個DataFrame的並集

df1 = df.select(["勝負", "命中", "投籃數"]).filter(df['投籃數'] > 25)
df2 = df.select(["勝負", "命中", "投籃數"]).filter(df['投籃數'] < 20)
print(df1.count(), df2.count())

ndf = df1.union(df2)
ndf.show()
2 7
+----+----+------+
|勝負|命中|投籃數|
+----+----+------+
|  勝|  12|    27|
|  勝|  16|    29|
|  勝|  10|    19|
|  勝|   8|    18|
|  負|   6|    19|
|  勝|   8|    15|
|  勝|   6|    16|
|  勝|   8|    19|
|  勝|   8|    16|
+----+----+------+

unionByName(other)

根據列名進行union

ndf.union(df2).distinct().show()
+----+----+------+
|勝負|命中|投籃數|
+----+----+------+
|  勝|   8|    18|
|  勝|   6|    16|
|  負|   6|    19|
|  勝|   8|    19|
|  勝|  12|    27|
|  勝|  16|    29|
|  勝|   8|    15|
|  勝|  10|    19|
|  勝|   8|    16|
+----+----+------+

withColumn(colName, col)

爲DataFrame增加一個列,如果DataFrame中已存在列名,則替換該列

# 增加一列,勝標記爲1 負標記爲0
from pyspark.sql import functions as F

df.withColumn('勝負_flag', F.when(df['勝負'] == '勝', 1).when(df['勝負'] == '負', 0)).show(5)
+---+----+----+------+----+------+----------+---------+----+----+----+---------+
|_c0|對手|勝負|主客場|命中|投籃數|投籃命中率|3分命中率|籃板|助攻|得分|勝負_flag|
+---+----+----+------+----+------+----------+---------+----+----+----+---------+
|  0|勇士|  勝|    客|  10|    23|     0.435|    0.444|   6|  11|  27|        1|
|  1|國王|  勝|    客|   8|    21|     0.381|    0.286|   3|   9|  27|        1|
|  2|小牛|  勝|    主|  10|    19|     0.526|    0.462|   3|   7|  29|        1|
|  3|灰熊|  負|    主|   8|    20|       0.4|     0.25|   5|   8|  22|        0|
|  4|76人|  勝|    客|  10|    20|       0.5|     0.25|   3|  13|  27|        1|
+---+----+----+------+----+------+----------+---------+----+----+----+---------+
only showing top 5 rows

withColumnRenamed(exciting, new)

通過重命名現有列來返回新的DataFrame

df.withColumnRenamed(existing='對手', new='比賽對手').show(3)
+---+--------+----+------+----+------+----------+---------+----+----+----+
|_c0|比賽對手|勝負|主客場|命中|投籃數|投籃命中率|3分命中率|籃板|助攻|得分|
+---+--------+----+------+----+------+----------+---------+----+----+----+
|  0|    勇士|  勝|    客|  10|    23|     0.435|    0.444|   6|  11|  27|
|  1|    國王|  勝|    客|   8|    21|     0.381|    0.286|   3|   9|  27|
|  2|    小牛|  勝|    主|  10|    19|     0.526|    0.462|   3|   7|  29|
+---+--------+----+------+----+------+----------+---------+----+----+----+
only showing top 3 rows

附上官方文檔的連接:http://spark.apache.org/docs/latest/api/python/pyspark.sql.html#pyspark.sql.DataFrame

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章