PySpark中如何基于某列存在特定值时为所有行设置新列值?
问题描述
我有如下输入DataFrame:
|sequence|company_number|errorCode|errorType|isDropped| +--------+--------------+---------+---------+---------+ | 9999999| XXXXXXXX| OADL0002| FILERJ| N| | 8487| YYYYYYYY| OADL0003| RJ| Y| | 8487| XXXXXXXX| OADL0004| RJ| Y| | 8487| YYYYYYYY| OADL0006| RJ| Y| | 8486| ZZZZZZZZ| OADL0007| RJ| Y| | 8487| YYYYYYYY| OADL0005| RJ| Y| | 8486| ZZZZZZZZ| OADL0008| RJ| Y|
需求是新增Dropped列:只要DataFrame里任意一行的errorType值为FILERJ,所有行的Dropped列都设为Y。期望输出如下:
|sequence|company_number|errorCode|errorType|isDropped|Dropped| +--------+--------------+---------+---------+---------+-------+ | 9999999| XXXXXXXX| OADL0002| FILERJ| N| Y| | 8487| YYYYYYYY| OADL0003| RJ| Y| Y| | 8487| XXXXXXXX| OADL0004| RJ| Y| Y| | 8487| YYYYYYYY| OADL0006| RJ| Y| Y| | 8486| ZZZZZZZZ| OADL0007| RJ| Y| Y| | 8487| YYYYYYYY| OADL0005| RJ| Y| Y| | 8486| ZZZZZZZZ| OADL0008| RJ| Y| Y|
解决方案
用Pandas可以快速实现这个需求,步骤很简单:
- 先判断整个DataFrame里有没有
errorType等于FILERJ的行; - 根据判断结果给所有行的
Dropped列统一赋值。
具体代码如下:
import pandas as pd # 构造输入数据 data = { 'sequence': [9999999, 8487, 8487, 8487, 8486, 8487, 8486], 'company_number': ['XXXXXXXX', 'YYYYYYYY', 'XXXXXXXX', 'YYYYYYYY', 'ZZZZZZZZ', 'YYYYYYYY', 'ZZZZZZZZ'], 'errorCode': ['OADL0002', 'OADL0003', 'OADL0004', 'OADL0006', 'OADL0007', 'OADL0005', 'OADL0008'], 'errorType': ['FILERJ', 'RJ', 'RJ', 'RJ', 'RJ', 'RJ', 'RJ'], 'isDropped': ['N', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y'] } df = pd.DataFrame(data) # 检查是否存在errorType为FILERJ的记录 has_filerj = df['errorType'].eq('FILERJ').any() # 新增Dropped列,统一赋值 df['Dropped'] = 'Y' if has_filerj else 'N' # 打印结果 print(df)
执行这段代码后,输出的DataFrame就会和期望的一致,所有行的Dropped列都为Y。如果输入数据里没有FILERJ的记录,Dropped列会统一设为N,适配两种场景。
内容的提问来源于stack exchange,提问作者Muskan Makhija
相关产品推荐
相关产品推荐

