的triggers
柱的樣品中我DASK數據幀如下所示:不兼容性在DASK適用的和熊貓dataframes
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
的所有可能值。
for trig in pop_triggers:
df[trig] = df.triggers.apply(lambda x: 1 if trig in x else 0)
然而,Total Traffic
,DNS
等列中的所有包含的相關值的值0和1不。當我將它複製到熊貓數據框中並執行相同的操作時,它們會獲得預期的值。
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
可能的錯誤也許
編輯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
注:我更關心的事情DASK側,而不是熊貓
嗨亞歷克斯,恐怕這不起作用。嘗試檢查'df.head()'。 –
所以我看到發生了什麼,從循環計算出來的最後一個serie被分配到所有列,看看可變性問題。這很奇怪,因爲我幾乎有完全相同的一段代碼,現在已經使用了幾個星期了......實際上,它感覺像'lambda'中的'trig'是可變的,所以計算時使用最後一個值所有列。 – Alex
答案更新爲工作版本。與開發人員覈實這是否是預期的行爲(在這種情況下,我認爲文檔沒有強調該問題)或錯誤是值得的 – Alex