Angenommen, ich habe den folgenden Datenrahmen (eine Spalte mit Ganzzahlen und eine Spalte mit einer Liste von Ganzzahlen) ...
ID Found_IDs
0 12345 [15443, 15533, 3433]
1 15533 [2234, 16608, 12002, 7654]
2 6789 [43322, 876544, 36789]
Und auch eine separate Liste von IDs ...
bad_ids = [15533, 876544, 36789, 11111]
Angesichts dessen und unter Ignorierung der df['ID']
Spalte und eines Index möchte ich sehen, ob eine der IDs in der bad_ids
Liste in der df['Found_IDs']
Spalte erwähnt wird. Der Code, den ich bisher habe, ist:
df['bad_id'] = [c in l for c, l in zip(bad_ids, df['Found_IDs'])]
Dies funktioniert jedoch nur, wenn die bad_ids
Liste länger als der Datenrahmen ist und für den realen Datensatz die bad_ids
Liste viel kürzer als der Datenrahmen ist. Wenn ich die bad_ids
Liste auf nur zwei Elemente setze ...
bad_ids = [15533, 876544]
Ich erhalte einen sehr beliebten Fehler (ich habe viele Fragen mit demselben Fehler gelesen) ...
ValueError: Length of values does not match length of index
Ich habe versucht, die Liste in eine Serie zu konvertieren (keine Änderung des Fehlers). Ich habe auch versucht, die neue Spalte hinzuzufügen und alle Werte auf zu setzen, False
bevor ich die Verständniszeile mache (wieder keine Änderung des Fehlers).
Zwei Fragen:
- Wie kann ich meinen Code (unten) für eine Liste verwenden, die kürzer als ein Datenrahmen ist?
- Wie würde ich den Code zum Schreiben der tatsächlich gefundenen ID in die
df['bad_id']
Spalte erhalten (nützlicher als Richtig / Falsch)?
Erwartete Ausgabe für bad_ids = [15533, 876544]
:
ID Found_IDs bad_id
0 12345 [15443, 15533, 3433] True
1 15533 [2234, 16608, 12002, 7654] False
2 6789 [43322, 876544, 36789] True
Ideale Ausgabe für bad_ids = [15533, 876544]
(ID (s) werden in eine oder mehrere neue Spalten geschrieben):
ID Found_IDs bad_id
0 12345 [15443, 15533, 3433] 15533
1 15533 [2234, 16608, 12002, 7654] False
2 6789 [43322, 876544, 36789] 876544
Code:
import pandas as pd
result_list = [[12345,[15443,15533,3433]],
[15533,[2234,16608,12002,7654]],
[6789,[43322,876544,36789]]]
df = pd.DataFrame(result_list,columns=['ID','Found_IDs'])
# works if list has four elements
# bad_ids = [15533, 876544, 36789, 11111]
# fails if list has two elements (less elements than the dataframe)
# ValueError: Length of values does not match length of index
bad_ids = [15533, 876544]
# coverting to Series doesn't change things
# bad_ids = pd.Series(bad_ids)
# print(type(bad_ids))
# setting up a new column of false values doesn't change things
# df['bad_id'] = False
print(df)
df['bad_id'] = [c in l for c, l in zip(bad_ids, df['Found_IDs'])]
print(bad_ids)
print(df)