PySpark对多个列应用相同的StringIndexer

2024-10-03 11:18:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下数据帧

+--------------+---------------+   
|       SrcAddr|        DstAddr|   
+--------------+---------------+  
| 192.168.100.5| 192.168.220.16|  
| 192.168.100.5| 192.168.220.15|  
|192.168.220.15|  192.168.100.5|  
|192.168.220.16|  192.168.100.5|  
| 192.168.100.5| 192.168.220.15|  
|192.168.220.16|  192.168.100.5|  
| 192.168.220.9|  192.168.100.5|  
| 192.168.100.5|  192.168.220.9|  
| 192.168.220.9|  192.168.100.5|  
+--------------+---------------+  

包含源地址和目标地址IP。 我想用StringIndexer在数值索引中转换它们,但是我想学习列之间的一个公共映射。在

不幸的是,StringIndexer并没有在PySpark中提供如此丰富的接口。因此,我找到了一个解决办法,但我想知道是否有更好的方法。在

我所做的是:
首先,我计算两列之间的并集

^{pr2}$

然后,我在新创建的DataFrame上学习了一个通用的StringIndexer:

addrIndexer = StringIndexer(inputCol="Addr", outputCol="AddrIdx")  
addrModel = addrIndexer.fit(all_addr_df)  

最后,我使用学习到的模型来转换原始数据帧。这是一个棘手的部分,因为我需要经常重命名列以获得所需的结果:

df = addrModel.transform(df.withColumnRenamed("SrcAddr", "Addr")).withColumnRenamed("Addr", "SrcAddr").withColumnRenamed("AddrIdx", "SrcAddrIdx")

df = addrModel.transform(df.withColumnRenamed("DstAddr", "Addr")).withColumnRenamed("Addr", "DstAddr").withColumnRenamed("AddrIdx", "DstAddrIdx")

因此,我想知道是否有可能更改StringIndexer的InputCol值,这将创建一个可读性很强的代码

谨致问候, 桑德罗


Tags: 数据ip目标df地址transformaddr源地址