我正在尝试通过检查Reason字符串列的内容来创建一个新的字符串列FailureType。我正在检查列Reason是否包含Trip,Lock,Fail等。如果'Reason‘包含Trip,那么应该用Trip填充新列FailureType,依此类推。
定义故障分类的函数
def failure_cat(df):
for reason in df['Reason']:
df['Reason'].str.contains("trip") == True
if any(df['Reason'].str.contains("trip")):
df['FailureType'] = "Trip"
elif any(df['Reason'].str.contains("lock")):
df['FailureType'] = "Locked Out"
elif any(df['Reason'].str.contains("force")):
df['FailureType'] = "Forced Outage"
elif any(df['Reason'].str.contains("Blow")):
df['FailureType'] = "Blown Out"
else:
df['FailureType'] = "Other"
return df
cap_bank['FailureType']生成结果:
0 Trip
1 Trip
2 Trip
3 Trip
4 Trip
5 Trip
6 Trip
7 Trip
8 Trip
9 Trip
10 Trip
11 Trip
12 Trip
13 Trip
14 Trip
15 Trip
16 Trip
17 Trip
18 Trip
19 Trip
20 Trip
21 Trip
22 Trip列'Reason‘看起来像这样:0上限。银行失败1家银行已两次跳闸。2银行已两次跳闸。3 cap银行跳闸并锁定服务。4个故障的绝缘子和反应堆造成火灾在…5盖板跳闸修复问题6 01/07/08: 11:00左右发生强制跳闸。7帽银行被绊倒并被锁在门外。8失败的351a继电器xfmr保护9失败的351a继电器xfmr保护10修复慢跳盖组11修复慢跳盖组12修复慢跳盖组13修复慢跳盖组。将取代ro..。14修复慢速脱扣盖板。将取代ro..。15个故障的绝缘子和反应堆造成火灾…
因此,我正在检查列'Reason‘中是否包含trip、lock等,并在此基础上填充新创建的列'FailureType’。但是所有行都填充了值Trip,但事实并非如此。我在这里做错了什么?
发布于 2019-07-24 02:56:14
当您运行代码时
df['FailureType'] = "Trip"它将值Trip赋值给列FailureType中的所有行。我认为发生的情况是dataset的最后一行包含trip,这导致循环结束时该列的值为Trip。
您想要做的是使用lambda,例如
def get_failure_type(reason):
if 'trip' in reason:
return 'Trip'
elif 'lock' in reason:
return 'Locked Out'
return 'Other'
df['FailureType'] = df['Reason'].apply(lambda x: get_failure_type(x))https://stackoverflow.com/questions/57167719
复制相似问题