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つの列を追加したいBB
、val1
とval2
。条件は以下のとおりです。
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]
コメントを追加