Disons que j'ai le dataframe suivant (une colonne d'entiers et une colonne avec une liste d'entiers) ...
ID Found_IDs
0 12345 [15443, 15533, 3433]
1 15533 [2234, 16608, 12002, 7654]
2 6789 [43322, 876544, 36789]
Et aussi une liste séparée d'ID ...
bad_ids = [15533, 876544, 36789, 11111]
Compte tenu de cela, et en ignorant la df['ID']
colonne et tout index, je veux voir si l'un des ID de la bad_ids
liste est mentionné dans la df['Found_IDs']
colonne. Le code que j'ai jusqu'à présent est:
df['bad_id'] = [c in l for c, l in zip(bad_ids, df['Found_IDs'])]
Cela fonctionne, mais uniquement si la bad_ids
liste est plus longue que la trame de données et pour le jeu de données réel, la bad_ids
liste sera beaucoup plus courte que la trame de données. Si je mets la bad_ids
liste à seulement deux éléments ...
bad_ids = [15533, 876544]
Je reçois une erreur très populaire (j'ai lu de nombreuses questions avec la même erreur) ...
ValueError: Length of values does not match length of index
J'ai essayé de convertir la liste en une série (aucun changement dans l'erreur). J'ai également essayé d'ajouter la nouvelle colonne et de définir toutes les valeurs False
avant de faire la ligne de compréhension (encore une fois aucun changement dans l'erreur).
Deux questions:
- Comment faire fonctionner mon code (ci-dessous) pour une liste plus courte qu'une trame de données?
- Comment puis-je obtenir le code pour écrire l'ID réel retrouvé dans la
df['bad_id']
colonne (plus utile que True / False)?
Sortie attendue pour 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
Sortie idéale pour bad_ids = [15533, 876544]
(les ID sont écrits dans une ou plusieurs nouvelles colonnes):
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)