Pyspark-異なるデータフレームの値に基づいてデータフレームに列を追加します

Qubix

2つのデータフレームがあります。

AA = 

+---+----+---+-----+-----+
| id1|id2| nr|cell1|cell2|
+---+----+---+-----+-----+
|  1|   1|  0| ab2 | ac3 |
|  1|   1|  1| dg6 | jf2 |
|  2|   1|  1| 84d | kf6 |
|  2|   2|  1| 89m | k34 |
|  3|   1|  0| 5bd | nc4 |
+---+----+---+-----+-----+

2番目のデータフレームBBは次のようになります。

BB =

+---+----+---+-----+
| a |   b|use|cell |
+---+----+---+-----+
|  1|   1|  x| ab2 |
|  1|   1|  a| dg6 |
|  2|   1|  b| 84d |
|  2|   2|  t| 89m |
|  3|   1|  d| 5bd |
+---+----+---+-----+

ここでBB、のセルセクションには、AA cell1およびcell2セクションに表示される可能性のあるすべてのセルがあります(cell1 - cell2は間隔です)。

私はに2つの列を追加したいBBval1val2条件は以下のとおりです。

val1 has 1 values when:
             id1 == id2 (in AA) , 
         and cell (in B) == cell1 or cell2 (in AA)
         and nr = 1 in AA.

and 0 otherwise. 

もう1つの列は、次のように構成されています。

val 2 has 1 values when:
           id1 != id2 in (AA)
      and  cell (in B) == cell1 or cell 2 in (AA)
      and  nr = 1 in AA.

      it also has 0 values otherwise.

私の試み:私は一緒に仕事をしようとしました:

from pyspark.sql.functions import when, col

condition = col("id1") == col("id2")
result = df.withColumn("val1", when(condition, 1)
result.show()

しかし、このタスクが私のpysparkスキルレベルをはるかに超えていることがすぐに明らかになりました。

編集:

私は実行しようとしています:

condition1 = AA.id1 == AA.id2
condition2 = AA.nr == 1
condition3 = AA.cell1 == BB.cell  | AA.cell2 == BB.cell

result = BB.withColumn("val1", when(condition1 & condition2 & condition3, 1).otherwise(0)

Zeppelinノートブック内でエラーが発生します:

Traceback (most recent call last):
  File "/tmp/zeppelin_pyspark-4362.py", line 344, in <module>
    code = compile('\n'.join(final_code), '<stdin>', 'exec', ast.PyCF_ONLY_AST, 1)
  File "<stdin>", line 6
    __zeppelin__._displayhook()
               ^
SyntaxError: invalid syntax

EDIT2:訂正してくれてありがとう、閉じ括弧がありませんでした。しかし今私は得る

ValueError: Cannot convert column into bool: please use '&' for 'and', '|' for 'or', '~' for 'not' when building DataFrame boolean expressions.

私はすでにこれらの演算子を使用しているので、これは厄介です。

ガウ

私の意見では、2つのデータフレームを結合するのが最善の方法であり、when句で条件をモデル化できます。新しい列を作成するとwithColumn、現在のデータフレームの値が繰り返されると思いますが、別のデータフレームの値にアクセスすることはできず、そこの行も繰り返されると思います。次のコードはあなたの要求を満たすはずです:

df_aa = spark.createDataFrame([
(1,1,0,"ab2", "ac3"),   
(1,1,1,"dg6", "jf2"),   
(2,1,1,"84d", "kf6"),   
(2,2,1,"89m", "k34"),   
(3,1,0,"5bd", "nc4")
], ("id1", "id2","nr","cell1","cell2"))

df_bb = spark.createDataFrame([
(1, 1, "x","ab2"),  
(1, 1, "a","dg6"),  
(2, 1, "b","84d"),  
(2, 2, "t","89m"),  
(3, 1, "d", "5bd")
], ("a", "b","use","cell"))

cond = (df_bb.cell == df_aa.cell1)|(df_bb.cell == df_aa.cell2)
df_bb.join(df_aa, cond, how="full").withColumn("val1", when((col("id1")==col("id2")) & ((col("cell")==col("cell1"))|(col("cell")==col("cell2"))) & (col("nr")==1), 1).otherwise(0)).withColumn("val2", when(~(col("id1")==col("id2")) & ((col("cell")==col("cell1"))|(col("cell")==col("cell2"))) & (col("nr")==1), 1).otherwise(0)).show()

結果は次のようになります。

+---+---+---+----+---+---+---+-----+-----+----+----+
|  a|  b|use|cell|id1|id2| nr|cell1|cell2|val1|val2|
+---+---+---+----+---+---+---+-----+-----+----+----+
|  1|  1|  x| ab2|  1|  1|  0|  ab2|  ac3|   0|   0|
|  1|  1|  a| dg6|  1|  1|  1|  dg6|  jf2|   1|   0|
|  2|  1|  b| 84d|  2|  1|  1|  84d|  kf6|   0|   1|
|  2|  2|  t| 89m|  2|  2|  1|  89m|  k34|   1|   0|
|  3|  1|  d| 5bd|  3|  1|  0|  5bd|  nc4|   0|   0|
+---+---+---+----+---+---+---+-----+-----+----+----+

それはcell==cell1|cell==cell2ほとんど結合条件ので、条件をチェックする必要さえないかもしれませんが、when条件をあなたの要件と同様にするために、そこに置きます

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Pyspark:udfを使用して、別のデータフレームの値に基づいてデータフレームに新しい列を追加します

分類Dev

Pyspark:1つの列の値に基づいて、あるデータフレームを別のデータフレームから減算します

分類Dev

他の列に基づいてpysparkデータフレームに新しい列を追加する

分類Dev

Pysparkデータフレーム:別の列の値に基づいて列を抽出します

分類Dev

値に基づいてpysparkデータフレームに新しい行を追加します

分類Dev

列値の変更に基づいてpysparkデータフレームを分割します

分類Dev

条件に基づいてpysparkデータフレームに列を追加します

分類Dev

条件と値のリストに基づいてpysparkデータフレームを作成します

分類Dev

データブリックス上の別のpysparkデータフレームのいくつかの列に基づいて、大きなpysparkデータフレームの列に対してユーザー定義関数を実行します

分類Dev

pysparkデータフレームに異なる列の値を表示する:python

分類Dev

Pyspark:複数の条件に基づいてデータフレームをフィルタリングします

分類Dev

別のデータフレームの一致する値に基づいてデータフレームをサブセット化するPyspark1.6.1

分類Dev

別のデータフレーム列値pysparkに基づいて列ステータスを設定します

分類Dev

PySpark データフレーム: 条件に基づいて 2 つの列を同時に変更する

分類Dev

Pysparkデータフレームの条件に基づいてセルの値を変更する方法

分類Dev

別の列に基づいてpysparkデータフレーム列を更新する

分類Dev

Pysparkは、データフレームgroupByに基づいて複数のファイルを作成します

分類Dev

PySpark:データフレーム内のUUIDを持つ列に基づいて新しい列を追加します

分類Dev

Pysparkを使用して、複数の値に基づいてデータフレームにn列を生成します

分類Dev

PySpark:array_containsに基づいてデータフレームの列に参加

分類Dev

PySparkの他のデータフレームの列値に基づいてインジケーター配列を作成する

分類Dev

複数の条件に基づいてPySparkデータフレームの行を削除します

分類Dev

pysparkデータフレーム内の別の列の値カウントに基づいて列を集計します

分類Dev

ランダムな値の列をpysparkデータフレームに追加します

分類Dev

pysparkの条件に基づいてデータフレームから行を削除します

分類Dev

pysparkデータフレームに別の列の最大値を持つ新しい列を追加します

分類Dev

Pyspark-データフレーム列の値を関数にフィードし、関数の出力を元のデータフレームに追加します

分類Dev

ファイル名をpysparkデータフレームの異なる列に分割します

分類Dev

一致する値に基づいて2つのpysparkデータフレームを結合します(特定の小数点まで)

Related 関連記事

  1. 1

    Pyspark:udfを使用して、別のデータフレームの値に基づいてデータフレームに新しい列を追加します

  2. 2

    Pyspark:1つの列の値に基づいて、あるデータフレームを別のデータフレームから減算します

  3. 3

    他の列に基づいてpysparkデータフレームに新しい列を追加する

  4. 4

    Pysparkデータフレーム:別の列の値に基づいて列を抽出します

  5. 5

    値に基づいてpysparkデータフレームに新しい行を追加します

  6. 6

    列値の変更に基づいてpysparkデータフレームを分割します

  7. 7

    条件に基づいてpysparkデータフレームに列を追加します

  8. 8

    条件と値のリストに基づいてpysparkデータフレームを作成します

  9. 9

    データブリックス上の別のpysparkデータフレームのいくつかの列に基づいて、大きなpysparkデータフレームの列に対してユーザー定義関数を実行します

  10. 10

    pysparkデータフレームに異なる列の値を表示する:python

  11. 11

    Pyspark:複数の条件に基づいてデータフレームをフィルタリングします

  12. 12

    別のデータフレームの一致する値に基づいてデータフレームをサブセット化するPyspark1.6.1

  13. 13

    別のデータフレーム列値pysparkに基づいて列ステータスを設定します

  14. 14

    PySpark データフレーム: 条件に基づいて 2 つの列を同時に変更する

  15. 15

    Pysparkデータフレームの条件に基づいてセルの値を変更する方法

  16. 16

    別の列に基づいてpysparkデータフレーム列を更新する

  17. 17

    Pysparkは、データフレームgroupByに基づいて複数のファイルを作成します

  18. 18

    PySpark:データフレーム内のUUIDを持つ列に基づいて新しい列を追加します

  19. 19

    Pysparkを使用して、複数の値に基づいてデータフレームにn列を生成します

  20. 20

    PySpark:array_containsに基づいてデータフレームの列に参加

  21. 21

    PySparkの他のデータフレームの列値に基づいてインジケーター配列を作成する

  22. 22

    複数の条件に基づいてPySparkデータフレームの行を削除します

  23. 23

    pysparkデータフレーム内の別の列の値カウントに基づいて列を集計します

  24. 24

    ランダムな値の列をpysparkデータフレームに追加します

  25. 25

    pysparkの条件に基づいてデータフレームから行を削除します

  26. 26

    pysparkデータフレームに別の列の最大値を持つ新しい列を追加します

  27. 27

    Pyspark-データフレーム列の値を関数にフィードし、関数の出力を元のデータフレームに追加します

  28. 28

    ファイル名をpysparkデータフレームの異なる列に分割します

  29. 29

    一致する値に基づいて2つのpysparkデータフレームを結合します(特定の小数点まで)

ホットタグ

アーカイブ