Eine Probe der triggers
Säule in meinem Dask Datenrahmen wie folgt aussieht:Inkompatibilität von in dask und Pandas gelten Datenrahmen
0 [Total Traffic, DNS, UDP]
1 [TCP RST]
2 [Total Traffic]
3 [IP Private]
4 [ICMP]
Name: triggers, dtype: object
Ich wünsche eine heißen codierte Version des oben genannten Arrays erstellen (Putten a 1
gegen die DNS
Spalte in Zeile 1 zum Beispiel), indem Sie Folgendes tun. pop_triggers
enthält alle möglichen Werte von triggers
.
for trig in pop_triggers:
df[trig] = df.triggers.apply(lambda x: 1 if trig in x else 0)
jedoch die Total Traffic
, DNS
usw. Spalten enthalten alle den Wert 0 und nicht 1 für den entsprechenden Wert. Wenn ich es in einen Pandas-Datenrahmen kopiere und denselben Vorgang mache, erhalten sie den erwarteten Wert.
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)
Was fehlt mir hier? Liegt es daran, dass dask faul ist, dass es die Werte nicht wie erwartet ausfüllt?
Edit 1: Ich untersuchte einige Orte, an denen die Flagge an erster Stelle gesetzt wurde (die weit weniger entpuppte als ich erwartet hatte, und bekam einige wirklich seltsame Ergebnisse siehe unten:.
df2 = df[df['Total Traffic']==1]
df2[['triggers']+pop_triggers].head()
Ausgang: vielleicht
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
möglich Fehler
Edit 2: Minimales Arbeitsbeispiel:
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()
Ausgang:
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
Hinweis: Ich bin weit mehr besorgt über die Dask Seite der Dinge und Pandas nicht
Hallo Alex, ich fürchte, das hat nicht funktioniert. Überprüfe 'df.head()'. –
so sehe ich, was vor sich geht, die letzte aus der Schleife berechnete Serie wird allen Spalten zugewiesen, schaut auf das Problem der Mutabilität. Das ist komisch, weil ich fast genau das gleiche Stück Code habe, das seit einigen Wochen verwendet wird ... Tatsächlich fühlt es sich so an, als ob die "Trig" im "Lambda" veränderbar bleibt und so der letzte Wert beim Rechnen verwendet wird alle Spalten. – Alex
Antwort aktualisiert mit einer funktionierenden Version. Es wäre lohnenswert, mit den Entwicklern zu überprüfen, ob dies erwartetes Verhalten ist (in diesem Fall glaube ich nicht, dass Dokumente das Problem hervorheben) oder ein Fehler – Alex