pysparkデータフレームに500列あります...一部は文字列型、一部はint、一部はブール値(100ブール値の列)です。これで、すべてのブール列に2つの異なるレベル(はいといいえ)があり、それらを1/0に変換したいと思います。
文字列の場合、passed、failed、nullの3つの値があります。これらのヌルを0に置き換えるにはどうすればよいですか?fillna(0)は整数でのみ機能します
c1| c2 | c3 |c4|c5..... |c500
yes| yes|passed |45....
No | Yes|failed |452....
Yes|No |None |32............
私がする時
df.replace(yes,1)
次のエラーが発生します:
ValueError: Mixed type replacements are not supported
文字列の場合、passed、failed、nullの3つの値があります。これらのヌルを0に置き換えるにはどうすればよいですか?fillna(0)は整数でのみ機能します
まず、インポートする場合と点灯
from pyspark.sql.functions import when, lit
DataFrameにこれらの列があると仮定します
# Reconstructing my DataFrame based on your assumptions
# cols are Columns in the DataFrame
cols = ['name', 'age', 'col_with_string']
# Similarly the values
vals = [
('James', 18, 'passed'),
('Smith', 15, 'passed'),
('Albie', 32, 'failed'),
('Stacy', 33, None),
('Morgan', 11, None),
('Dwight', 12, None),
('Steve', 16, 'passed'),
('Shroud', 22, 'passed'),
('Faze', 11,'failed'),
('Simple', 13, None)
]
# This will create a DataFrame using 'cols' and 'vals'
# spark is an object of SparkSession
df = spark.createDataFrame(vals, cols)
# We have the following DataFrame
df.show()
+------+---+---------------+
| name|age|col_with_string|
+------+---+---------------+
| James| 18| passed|
| Smith| 15| passed|
| Albie| 32| failed|
| Stacy| 33| null|
|Morgan| 11| null|
|Dwight| 12| null|
| Steve| 16| passed|
|Shroud| 22| passed|
| Faze| 11| failed|
|Simple| 13| null|
+------+---+---------------+
次を使用できます。
nullの値を0に置き換えることができます
df = df.withColumn('col_with_string', when(df.col_with_string.isNull(),
lit('0')).otherwise(df.col_with_string))
# We have replaced nulls with a '0'
df.show()
+------+---+---------------+
| name|age|col_with_string|
+------+---+---------------+
| James| 18| passed|
| Smith| 15| passed|
| Albie| 32| failed|
| Stacy| 33| 0|
|Morgan| 11| 0|
|Dwight| 12| 0|
| Steve| 16| passed|
|Shroud| 22| passed|
| Faze| 11| failed|
|Simple| 13| 0|
+------+---+---------------+
あなたの質問のパート1-はい/いいえブール値-あなたはブール値の100列があると言いました。このために、私は通常、更新された値でテーブルを再構築するか、UDFを作成してYesまたはNoに対して1または0を返します。
さらに2つの列can_voteとcan_lottoをDataFrame(df)に追加しています
df = df.withColumn("can_vote", col('Age') >= 18)
df = df.withColumn("can_lotto", col('Age') > 16)
# Updated DataFrame will be
df.show()
+------+---+---------------+--------+---------+
| name|age|col_with_string|can_vote|can_lotto|
+------+---+---------------+--------+---------+
| James| 18| passed| true| true|
| Smith| 15| passed| false| false|
| Albie| 32| failed| true| true|
| Stacy| 33| 0| true| true|
|Morgan| 11| 0| false| false|
|Dwight| 12| 0| false| false|
| Steve| 16| passed| false| false|
|Shroud| 22| passed| true| true|
| Faze| 11| failed| false| false|
|Simple| 13| 0| false| false|
+------+---+---------------+--------+---------+
can_voteおよびcan_lottoと同様の列があると仮定します(ブール値はYes / Noです)
次のコード行を使用して、ブール型のDataFrameの列をフェッチできます。
col_with_bool = [item[0] for item in df.dtypes if item[1].startswith('boolean')]
これはリストを返します
['can_vote', 'can_lotto']
UDFを作成し、このタイプのリストの各列を反復処理して、1(はい)または0(いいえ)を使用して各列を点灯させることができます。
参考までに、以下のリンクを参照してください
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加