假设我有两个表。在下面的例子中,只有两个列发生变化,但不确定如果透视将工作良好的10列。表1:
--------------------------
|id |filtercol| inputid1|
--------------------------
|100| 10 | 4 |
|108| 10 | 5 |
|200| 9 | 4 |
|106| 9 | 6 |
|110| 11 | 7 |
|130| 9 | 7 |
--------------------------
表二:
---------------------------------
|a | b | c | d |
---------------------------------
|"hello"| 1 | 4 | 6 |
|"world"| 2 | 5 | 6 |
|"test" | 3 | 4 | 7 |
---------------------------------
我希望决赛桌
----------------------------------
|a | b | 10 | 11|
----------------------------------
|"hello"| 1 | 100 | |
|"world"| 2 | 108 | |
|"test" | 3 | 100 |110|
---------------------------------
因此,c col将更改为10,d col将重命名为11。
然后在filtercol列名中使用10作为表1的过滤器,并使用列c和d中的值作为列inputid1的查找值。无论找到什么值,我们都将表2的值更改为表1中的id值。
例如,对于第一行,新表的第10列中有100,因为我们使用了该行中的原始值4作为列inputid1的查找,然后使用新的c列名10作为列filtercol上的过滤器,并获得了ID 100,因此现在在此列中将4替换为100。
第11列返回空值的原因是,当使用6作为筛选列时,在使用6作为筛选列后,查找中没有返回值。
我正在考虑可能的加入和过滤,但似乎不是很好的解决方案,因为让我们说,我有col e,f,g,hi,j检查太多。
df2 = df.withColumnRenamed("c","10")
df2 = df.withColumnRenamed("d","11")
table3df = (
df1.join(df2,
df1.inputid1 == df2.10, how='left')
)
table3df = table3df.filter(col("filtercol") ==int(col("10"))
1条答案
按热度按时间voj3qocg1#
我对你的例子做了一些尝试,还没有完全实现。你没有提到当
c
列中有多个值匹配时该怎么办。我用max
解决了这个问题,它给了我一个与你所期望的不同的答案。