我想使用 apply 函数和 lambda 函数从列表值中添加列中的值
我已经尝试使用“for”,但它花了很多时间,因为有很多行(超过 60,000 行)。
例如 如果“connection_type”为“snmpgetattack”,则“attack_type”必须为“R2L”。
dos = ['udpstorm', 'apache2', 'mailbomb', 'back', 'neptune', 'land',
'smurf', 'teardrop', 'processtable', 'pod']
probe = ['satan', 'nmap', 'portsweep', 'mscan', 'ipsweep', 'saint']
r2l = ['httptunnel', 'ftp_write', 'worm', 'imap', 'xlock', 'multihop',
'warezmaster', 'named', 'snmpguess', 'phf', 'snmpgetattack',
'xsnoop', 'guess_password', 'sendmail']
最佳答案
首先从列表中创建列表字典,交换值并使用 Series.map
Series.str.rstrip
删除了最后一个 .
:
通知:
如果任何列表中都不存在值,map
函数将返回缺失值NaN
。例如
在 normal.
值的示例数据中,因为列表中没有 normal
。
d1 = {'dos':dos,'probe':probe,'r2l':r2l}
#swap key values in dict
#http://stackoverflow.com/a/31674731/2901002
d = {k: oldk for oldk, oldv in d1.items() for k in oldv}
df['attack_type'] = df['connection_type'].str.rstrip('.').map(d)
详细信息:
print (d)
{'udpstorm': 'dos', 'apache2': 'dos', 'mailbomb': 'dos', 'back': 'dos', 'neptune': 'dos', 'land': 'dos', 'smurf': 'dos', 'teardrop': 'dos', 'processtable': 'dos', 'pod': 'dos', 'satan': 'probe', 'nmap': 'probe', 'portsweep': 'probe', 'mscan': 'probe', 'ipsweep': 'probe', 'saint': 'probe', 'httptunnel': 'r2l', 'ftp_write': 'r2l', 'worm': 'r2l', 'imap': 'r2l', 'xlock': 'r2l', 'multihop': 'r2l', 'warezmaster': 'r2l', 'named': 'r2l', 'snmpguess': 'r2l', 'phf': 'r2l', 'snmpgetattack': 'r2l', 'xsnoop': 'r2l', 'guess_password': 'r2l', 'sendmail': 'r2l'}
关于python - 如何使用 apply 函数和 lambda 函数将列表的值添加到列值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58162447/