我正在尝试将数据框中的所有值增加1,除了ID列是一列。
示例:
结果:
到目前为止,这是我要做的,但是当我要处理许多列时(例如50个),它会变得有点长。
df_add = df.select(
'Id',
(df['col_a'] + 1).alias('col_a'),
..
..
)
是否有更多的Python方式可以达到相同的结果?
答案 0 :(得分:4)
编辑(基于@Daniel注释): 您可以直接使用lit函数
from pyspark.sql.functions import col, lit
for column in plus_one_cols:
df = df.withColumn(column, col(column) + lit(1))
上一个答案:
在列中添加“ 1”是一种列式操作,可能更适合pandas_udf
from pyspark.sql.functions import col, pandas_udf, PandasUDFType
@pandas_udf('double', PandasUDFType.SCALAR)
def plus_one(v):
return v + 1
plus_one_cols = [x for x in df.columns if x != "Id"]
for column in plus_one_cols:
df = df.withColumn(column, plus_one(col(column)))
这将比按行操作快得多。您也可以参考Introducing Pandas UDF for PySpark - Databricks
答案 1 :(得分:1)
如果列很多,则可以使用下面的单行格式,
from pyspark.sql.functions import lit,col
df.select('Id', *[(col(i) + lit(1)) for i in df.columns if i != 'Id']).toDF(*df.columns).show()
输出:
+---+-----+-----+-----+
| Id|col_a|col_b|col_c|
+---+-----+-----+-----+
| 1| 4| 21| 6|
| 5| 6| 1| 1|
| 6| 10| 2| 1|
+---+-----+-----+-----+
答案 2 :(得分:0)
您可以使用withColumn
方法,然后按如下所示遍历各列:
df_add = df
for column in ["col_a", "col_b", "col_c"]:
df_add = df_add.withColumn(column, expr(f"{column} +1").cast("integer"))
答案 3 :(得分:0)
使用php artisan clear:cache && php artisan clear:config && php artisan config:cache
向列添加值
例如:
pyspark.sql.functions.lit