PySpark DataFrame 的列操作

本文介绍了 PySpark 中 DataFrame 的常用操作方法,包括新增列、删除列、重命名列、缺失值填充、值替换、类型转换及排序等。通过具体实例展示了如何高效地处理数据。

目录

.withColumn 新增一列 

.drop丢弃指定列

.alias重命名列名的别名

.withColumnRenamed 重命名列名,得到新的df 

 DataFrame.fillna 指定列的缺失值填充

 DataFrame.replace 替换各列中对应的值 

Column.astype(dataType)  和.cast (dataType)# 类型转换

column.asc 整个df按照某列的升序排序,常结合df.orderBy使用

Column.between(lowerBound, upperBound)  某字段是否在指定区间范围内

Column.contains(other)  # 是否包含某个字符,直接返回的是列,用filter或者[]筛选出得到对应的df行即可。

Column.endswith(other)  # 字段以什么结束的值,直接返回的是列,用filter或者[]筛选出得到对应的df行即可。

Column.isNotNull()  # 筛选列中非空的,得到对应的内容

Column.isin(*cols)  # 返回包含某些值的行

Column.like(other)  # 返回含有关键词的行, rlike 会进行正则匹配,


如果你觉得下面的资料有用,还请点赞、收藏,支持下,你的鼓励是我继续整理的一个动力,非常感谢

样例数据,简单建一个DataFrame 

rdd = sc.parallelize([("Sam", 28, 88.52, "M"),
                      ("Flora", 28, 90.55, "F"),
                      ("Mey", 1, None, "M"),
                      ("Chery", 7, 80.23, "F")])
test = rdd.toDF(["name", "age", "score", "sex"])
test.show()
+-----+---+-----+---+
| name|age|score|sex|
+-----+---+-----+---+
|  Sam| 28|88.52|  M|
|Flora| 28|90.55|  F|
|  Mey|  1| null|  M|
|Chery|  7|80.23|  F|

.withColumn 新增一列 

新增列,注意原dataframe并未改变

test2 = test.withColumn('big_score',test['score']+1)
test2.show()

结果显示: 

+-----+---+-----+---+---------+
| name|age|score|sex|big_score|
+-----+---+-----+---+---------+
|  Sam| 28|88.52|  M|    89.52|
|Flora| 28|90.55|  F|    91.55|
|  Mey|  1| null|  M|     null|
|Chery|  7|80.23|  F|    81.23|
+-----+---+-----+---+---------+

1)新增一列常数项 withColumn 结合 functions.lit(value) 

from pyspark.sql import functions
test2 = test.withColumn("add_constant",functions.lit(10))
test2.show()

结果如: 

+-----+---+-----+---+------------+
| name|age|score|sex|add_constant|
+-----+---+-----+---+------------+
|  Sam| 28|88.52|  M|          10|
|Flora| 28|90.55|  F|          10|
|  Mey|  1| null|  M|          10|
|Chery|  7|80.23|  F|          10|
+-----+---+-----+---+------------+

2) 简单根据某列进行计算得到新的列 

from pyspark.sql import functions
test_3 = test.withColumn("name_length",functions.length(test.name))
test_3.show()

结果如:

+-----+---+-----+---+-----------+
| name|age|score|sex|name_length|
+-----+---+-----+---+-----------+
|  Sam| 28|88.52|  M|          3|
|Flora| 28|90.55|  F|          5|
|  Mey|  1| null|  M|          3|
|Chery|  7|80.23|  F|          5|

3)使用selectExpr 里面的sql计算 

test_4 = test.selectExpr(["name","age","score","sex","length(name) as name_length"])
test_4.show()

结果如: 

+-----+---+-----+---+-----------+
| name|age|score|sex|name_length|
+-----+---+-----+---+-----------+
|  Sam| 28|88.52|  M|          3|
|Flora| 28|90.55|  F|          5|
|  Mey|  1| null|  M|          3|
|Chery|  7|80.23|  F|          5|
此处参考: pyspark 给dataframe增加新的一列

.drop丢弃指定列

删除列,返回一个新的dataframe,注意原dataframe的列并未改变。如果要改变原df,需要赋值覆盖。 

test.drop('age').show() # 得到的新的df删除了列
print(test.show()) # 原df中age仍然存在。 

test= test.drop('age')

test.show()  # age被删除

.alias重命名列名的别名

输入列的操作,在select等里面嵌套着用

test.select('name',test.age.alias('gender')).show()
## test本身的列age并没有改变

输出: 

+-----+------+
| name|gender|
+-----+------+
|  Sam|    28|
|Flora|    28|
|  Mey|     1|
|Chery|     7|
+-----+------+
<think>我们被要求计算PySpark DataFrame中某一的均值。根据引用[2]和引用[3],我们可以使用聚合函数来实现。 在PySpark中,计算某的平均值通常使用`agg`函数结合`avg`聚合函数,或者直接使用`mean`函数。 以下是两种常用方法: 方法一:使用`agg`和`avg`函数 ```python from pyspark.sql import functions as F # 假设DataFrame名为df名为"column_name" mean_value = df.agg(F.avg("column_name")).collect()[0][0] ``` 方法二:使用`select`和`avg`函数(也可以使用`mean`,它们是等价的) ```python from pyspark.sql import functions as F mean_value = df.select(F.avg("column_name")).first()[0] ``` 或者,如果我们想同时计算多个的均值,可以使用`agg`并传入多个聚合表达式: ```python result = df.agg(F.avg("column1").alias("avg_column1"), F.avg("column2").alias("avg_column2")) ``` 注意:`avg`函数会忽略NULL值。如果中有NULL,它们不会被计入分母。 如果我们需要将结果保留在DataFrame中而不是直接收集到Driver端,可以这样做: ```python df_agg = df.agg(F.avg("column_name").alias("mean_column_name")) ``` 这样,`df_agg`是一个新的DataFrame,包含一一行(均值)。 另外,根据引用[3],如果是复杂类型(比如数组),我们可能需要先进行展开操作(explode)或提取元素,然后再计算平均值。 示例:计算"column_name"的平均值并显示 ```python df.select(F.avg("column_name")).show() ``` 输出结果将是一个单行单DataFrame,显示平均值。 注意:在分布式环境下,使用`collect()`或`first()`将结果拉取到Driver端时要谨慎,确保结果数据量小,否则可能导致Driver内存溢出。 相关问题: 1. 如何计算PySpark DataFrame中多的平均值? 2. 在计算均值时如何处理NULL值?PySpark的聚合函数默认行为是什么? 3. 如何计算其他统计量(如标准差、最大值、最小值等)? 4. 如果数据量很大,计算均值时需要注意什么性能问题?</think>在 PySpark 中计算 DataFrame的平均值,主要通过聚合函数实现。以下是详细方法和示例: ### 方法一:使用 `agg()` 聚合函数(推荐) ```python from pyspark.sql import functions as F # 计算单个的平均值 avg_value = df.agg(F.avg("your_column")).collect()[0][0] print(f"平均值: {avg_value}") # 同时计算多统计量 result = df.agg( F.avg("age").alias("平均年龄"), F.avg("income").alias("平均收入") ).collect()[0] print(f"年龄均值: {result['平均年龄']}, 收入均值: {result['平均收入']}") ``` ### 方法二:使用 `select()` 直接计算 ```python from pyspark.sql import functions as F avg_df = df.select(F.avg("your_column").alias("mean_value")) avg_df.show() # 显示包含平均值的DataFrame ``` ### 方法三:SQL 风格计算 ```python df.createOrReplaceTempView("temp_table") spark.sql("SELECT AVG(your_column) AS mean_value FROM temp_table").show() ``` ### 关键说明: 1. **函数选择**: - `F.avg()` 或 `F.mean()` 均可计算平均值(两者等价) - 默认忽略 NULL 值,符合 SQL 标准[^2] 2. **复杂数据类型处理**: 若包含数组类型(如引用[3]场景),需先展开: ```python from pyspark.sql.functions import explode df.withColumn("expanded", explode("array_column")) \ .agg(F.avg("expended")).show() ``` 3. **性能优化**: - 大数据集优先使用 `agg()` 而非 `select()` - 结合缓存使用:`df.cache().agg(...)`[^2] ### 完整示例: ```python # 创建示例DataFrame data = [("A", 25, 50000), ("B", 30, 60000), (None, None, 70000)] df = spark.createDataFrame(data, ["name", "age", "income"]) # 计算收入平均值(自动忽略NULL) df.agg(F.avg("income").alias("avg_income")).show() ``` 输出: ``` +----------+ |avg_income| +----------+ | 60000.0| +----------+ ``` ### 验证计算结果 ```python import numpy as np pandas_df = df.select("income").toPandas() print("验证:", np.mean(pandas_df["income"].dropna())) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值