我有以下資料:
----- -------------------- -----------
|Sr No| User Id|Transaction|
----- -------------------- -----------
|1 |paytm 111002203@p...| 100D|
|2 |paytm 111002203@p...| 50C|
|3 |paytm 111002203@p...| 20C|
|4 |paytm 111002203@p...| 10C|
|5 | null| 1C|
----- -------------------- -----------
我需要將 Transaction 列分為 Amount 和 CreditOrDebit。我試過這個:
df_sample.withColumn('CreditOrDebit',substring('Transaction',-1,1)).withColumn('Amount',substring('Transaction',-2,-4)).show()
# ----- -------------------- ----------- ------------- ------
# |Sr No| User Id|Transaction|CreditOrDebit|Amount|
# ----- -------------------- ----------- ------------- ------
# | 1|paytm 111002203@p...| 100D| D| |
# | 2|paytm 111002203@p...| 50C| C| |
# | 3|paytm 111002203@p...| 20C| C| |
# | 4|paytm 111002203@p...| 10C| C| |
# | 5| null| 1C| C| |
# ----- -------------------- ----------- ------------- ------
所以我嘗試使用instr來獲取“D”或“C”第一次出現的長度:
df_sample.withColumn('CreditOrDebit',substring('Transaction',-1,1)).withColumn('Amount',substring('Transaction',1,instr('Transaction','C' or 'D'))).show()
我收到錯誤:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Users\Aniket\SPARKHOME\python\pyspark\sql\functions.py", line 1668, in substring
return Column(sc._jvm.functions.substring(_to_java_column(str), pos, len))
File "C:\Users\Aniket\SPARKHOME\python\lib\py4j-0.10.9-src.zip\py4j\java_gateway.py", line 1296, in __call__
File "C:\Users\Aniket\SPARKHOME\python\lib\py4j-0.10.9-src.zip\py4j\java_gateway.py", line 1260, in _build_args
File "C:\Users\Aniket\SPARKHOME\python\lib\py4j-0.10.9-src.zip\py4j\java_gateway.py", line 1247, in _get_args
File "C:\Users\Aniket\SPARKHOME\python\lib\py4j-0.10.9-src.zip\py4j\java_collections.py", line 510, in convert
File "C:\Users\Aniket\SPARKHOME\python\pyspark\sql\column.py", line 353, in __iter__
raise TypeError("Column is not iterable")
TypeError: Column is not iterable
所以我只嘗試了'C',因為我確定INSTR不會支持它或在它內部并得到同樣的錯誤。
uj5u.com熱心網友回復:
您可以使用該regexp_extract函式分別提取數字和字母。
df = df.withColumn('CreditOrDebit', F.regexp_extract('Transaction', '[A-Z] ', 0)) \
.withColumn('Amount', F.regexp_extract('Transaction', '[0-9] ', 0))
df.show(truncate=False)
uj5u.com熱心網友回復:
您可以重復使用您已經創建的“CreditOrDebit”列。substring_index找到一個字串(C 或 D)并回傳它之前的結果。
df_sample.withColumn('CreditOrDebit', substring('Transaction', -1, 1)) \
.withColumn('Amount', expr("substring_index(Transaction, CreditOrDebit, 1)")) \
.show()
# ----------- ------------- ------
# |Transaction|CreditOrDebit|Amount|
# ----------- ------------- ------
# | 100D| D| 100|
# | 50C| C| 50|
# | 20C| C| 20|
# | 10C| C| 10|
# | 1C| C| 1|
# ----------- ------------- ------
uj5u.com熱心網友回復:
您可以使用 regexp_extract ,否則
>>> from pyspark.sql.functions import when
>>> from pyspark.sql.functions import col
>>> df1=df.withColumn("Transaction_type",when(col("Transaction").contains("D"),"D").otherwise("C"))
>>> df1.show()
----- ----------------- ----------- ----------------
|Sr No| User Id|Transaction|Transaction_type|
----- ----------------- ----------- ----------------
| 1|paytm 111002203@p| 100D| D|
| 2|paytm 111002203@p| 50C| C|
| 3|paytm 111002203@p| 20C| C|
| 4|paytm 111002203@p| 10C| C|
| 5| null| 1C| C|
----- ----------------- ----------- ----------------
>>> df1.withColumn('Transaction_amount', regexp_extract(col('Transaction'),'(\d )',1)).show()
----- ----------------- ----------- ---------------- ------------------
|Sr No| User Id|Transaction|Transaction_type|Transaction_amount|
----- ----------------- ----------- ---------------- ------------------
| 1|paytm 111002203@p| 100D| D| 100|
| 2|paytm 111002203@p| 50C| C| 50|
| 3|paytm 111002203@p| 20C| C| 20|
| 4|paytm 111002203@p| 10C| C| 10|
| 5| null| 1C| C| 1|
----- ----------------- ----------- ---------------- ------------------
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/497523.html
上一篇:計算PySparkDataframe中分類列的更改次數
下一篇:資料子集上的視窗函式
