Powiedzmy, że mam następującą ramkę danych (kolumna liczb całkowitych i kolumna z listą liczb całkowitych) ...
ID Found_IDs
0 12345 [15443, 15533, 3433]
1 15533 [2234, 16608, 12002, 7654]
2 6789 [43322, 876544, 36789]
A także osobna lista identyfikatorów ...
bad_ids = [15533, 876544, 36789, 11111]
Biorąc to pod uwagę i ignorując df['ID']
kolumnę i dowolny indeks, chcę sprawdzić, czy którykolwiek z identyfikatorów na bad_ids
liście jest wymieniony w df['Found_IDs']
kolumnie. Dotychczasowy kod to:
df['bad_id'] = [c in l for c, l in zip(bad_ids, df['Found_IDs'])]
Działa to, ale tylko wtedy, gdy bad_ids
lista jest dłuższa niż ramka danych, a dla prawdziwego zestawu danych bad_ids
lista będzie znacznie krótsza niż ramka danych. Jeśli ustawię bad_ids
listę tylko na dwa elementy ...
bad_ids = [15533, 876544]
Otrzymuję bardzo popularny błąd (przeczytałem wiele pytań z tym samym błędem) ...
ValueError: Length of values does not match length of index
Próbowałem przekonwertować listę na serię (bez zmiany błędu). Próbowałem również dodać nową kolumnę i ustawić wszystkie wartości False
przed wykonaniem wiersza zrozumienia (ponownie bez zmiany błędu).
Dwa pytania:
- Jak sprawić, by mój kod (poniżej) działał na liście krótszej niż ramka danych?
- Jak uzyskać kod do zapisania rzeczywistego identyfikatora znalezionego z powrotem w
df['bad_id']
kolumnie (bardziej przydatny niż True / False)?
Oczekiwany wynik dla 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
Idealne dane wyjściowe dla bad_ids = [15533, 876544]
(ID) są zapisywane w nowej kolumnie lub kolumnach:
ID Found_IDs bad_id
0 12345 [15443, 15533, 3433] 15533
1 15533 [2234, 16608, 12002, 7654] False
2 6789 [43322, 876544, 36789] 876544
Kod:
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)