web-dev-qa-db-ja.com

pysparkは、データフレームのすべての値を別の値に置き換えます

私のpysparkデータフレームには500列があります...一部は文字列型、一部はint、一部はブール(100ブール列)です。現在、すべてのブール列には2つの異なるレベルがあります-はいといいえ、それらを1/0に変換したいと思います

文字列の場合、3つの値が渡され、失敗し、nullになります。これらのnullを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
5
Emma

文字列の場合、3つの値が渡され、失敗し、nullになります。これらのnullを0に置き換えるにはどうすればよいですか? fillna(0)は整数でのみ機能します

まず、whenlitをインポートします

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|
+------+---+---------------+

以下を使用できます。

  • withColumn()-使用する列を指定します。
  • isNull()-属性が評価されるtrue iffと評価されるフィルターヌルに
  • lit()-リテラルの列を作成します
  • when()otherwise()-状態をチェックするために使用されますカラムに関して

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(いいえ)を使用して各列を照らすことができます。

参考までに、以下のリンクを参照してください

1
karma4917

以下のデータであなたの問題を再現しようとしました:

df_test=pd.DataFrame([['yes','pass',1.2],['No','pass',34],['yes',None,0.4],[0,1,'No'],['No',1,True],['NO','YES',1]])

それから私は使うだけです:

df_test.replace('yes',1)
2
Amine Kaddioui

df.na.fill()を使用する必要がありますが、関数fillの引数の列を区別します。

あなたは次のようなものを持っているでしょう:

df_test.na.fill({"value":"","c4":0}).show()
0
plalanne

Koalasを使用してPandasのような操作をSparkで実行できます。ただし、特定のデータフレームのスキーマを尊重する必要があります。Koalasを使用すると、次のことができます。

df = df.replace('yes','1')

すべての文字列を数字に置き換えたら、列をintにキャストできます。特定の空の値をNaNで置き換えたい場合は、次のことをお勧めします。

df = df .replace(['?'], None) 
0
Horbaje