我的Dask dataframe中的triggers
列的示例如下所示:
0 [Total Traffic, DNS, UDP]
1 [TCP RST]
2 [Total Traffic]
3 [IP Private]
4 [ICMP]
Name: triggers, dtype: object
我希望通过执行以下操作来创建上述数组的一个热编码版本(例如,在第1行的DNS
列上放置一个1
列)。pop_triggers
包含triggers
的所有可能值。在
但是,Total Traffic
、DNS
等列都包含相关值的值0,而不是1。当我将它复制到pandas数据帧并执行相同的操作时,它们将获得预期值。在
a = df[[ 'Total Traffic', 'UDP', 'NTP Amplification', 'triggers', 'ICMP']].head()
for trig in pop_triggers:
a[trig] = a.triggers.apply(lambda x: 1 if trig in x else 0)
我错过了什么?是因为dask很懒,所以它没有按预期填写值吗?在
编辑1: 我调查了一些一开始设置国旗的地方(结果发现远远低于我的预期,得到了一些非常奇怪的结果。见下文:
df2 = df[df['Total Traffic']==1]
df2[['triggers']+pop_triggers].head()
输出:
triggers Total Traffic UDP DNS
9380 [ICMP, IP null, IP Private, TCP null, TCP SYN,... 1 1 1
9388 [ICMP, IP null, IP Private, TCP null, TCP SYN,... 1 1 1
19714 [ICMP, IP null, IP Private, UDP, NTP Amplifica... 1 1 1
21556 [IP null] 1 1 1
21557 [IP null] 1 1 1
可能的bug?
编辑2: 最小工作示例:
triggers = [['Total Traffic', 'DNS', 'UDP'],['TCP RST'],['Total Traffic'],['IP Private'],['ICMP']]*10
df2 = dd.from_pandas(pd.DataFrame({'triggers':triggers}), npartitions=16)
pop_triggers= ['Total Traffic', 'UDP', 'DNS', 'TCP SYN', 'TCP null', 'ICMP']
for trig in pop_triggers:
df2[trig] = df2.triggers.apply(lambda x: 1 if trig in x else 0)
df2.head()
输出:
triggers Total Traffic UDP DNS TCP SYN TCP null ICMP
0 [Total Traffic, DNS, UDP] 0 0 0 0 0 0
1 [TCP RST] 0 0 0 0 0 0
2 [Total Traffic] 0 0 0 0 0 0
3 [IP Private] 0 0 0 0 0 0
注意:我更关心的是达斯克的一面,而不是熊猫
根据我的经验,} 一起工作得更好。有一些功能可以让
apply
中的dask
与显式^{dask
尝试猜测metadata
,但我发现它速度慢,而且不总是可靠的。另外,指导原则是指定meta
。在我的另一点经验是
assign
比df[col] = ...
工作得更好。我不确定这是一个bug、一个限制还是一个误用(我前一段时间研究过了,我不认为这是一个bug)。在编辑:第一个模式不起作用,循环中用于前几列的
trig
值似乎被更新了,因此在计算时,这只给出所有列的最后一个值的结果!在这不是一个bug,而是没有立即计算的组合,而lambda结果是延迟计算对闭包的尚未计算。请参见this discussion了解它为什么不起作用。在
我的模式是:正确模式:
(抱歉,之前没有测试,因为我运行的是相同的模式,除了我没有在应用的函数中使用循环值,所以没有面对这种行为)
^{pr2}$相关问题 更多 >
编程相关推荐