Supponiamo di avere il seguente frame di dati (una colonna di numeri interi e una colonna con un elenco di numeri interi) ...
ID Found_IDs
0 12345 [15443, 15533, 3433]
1 15533 [2234, 16608, 12002, 7654]
2 6789 [43322, 876544, 36789]
E anche un elenco separato di ID ...
bad_ids = [15533, 876544, 36789, 11111]
Detto questo, e ignorando la df['ID']colonna e qualsiasi indice, voglio vedere se qualcuno degli ID bad_idsnell'elenco è menzionato nella df['Found_IDs']colonna. Il codice che ho finora è:
df['bad_id'] = [c in l for c, l in zip(bad_ids, df['Found_IDs'])]
Funziona ma solo se l' bad_idselenco è più lungo del dataframe e per il set di dati reale l' bad_idselenco sarà molto più breve del dataframe. Se imposto l' bad_idselenco su solo due elementi ...
bad_ids = [15533, 876544]
Ottengo un errore molto popolare (ho letto molte domande con lo stesso errore) ...
ValueError: Length of values does not match length of index
Ho provato a convertire l'elenco in una serie (nessuna modifica all'errore). Ho anche provato ad aggiungere la nuova colonna e impostare tutti i valori Falseprima di fare la riga di comprensione (di nuovo nessuna modifica dell'errore).
Due domande:
- Come faccio a far funzionare il mio codice (di seguito) per un elenco più corto di un frame di dati?
- Come ottenere il codice per scrivere l'ID effettivo trovato nella
df['bad_id']colonna (più utile di Vero / Falso)?
Uscita prevista per 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
Output ideale per bad_ids = [15533, 876544](ID (s) sono scritti in una nuova colonna o colonne):
ID Found_IDs bad_id
0 12345 [15443, 15533, 3433] 15533
1 15533 [2234, 16608, 12002, 7654] False
2 6789 [43322, 876544, 36789] 876544
Codice:
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)