Скажімо, у мене є такий фрейм даних (стовпець цілих чисел та стовпець із переліком цілих чисел) ...
ID Found_IDs
0 12345 [15443, 15533, 3433]
1 15533 [2234, 16608, 12002, 7654]
2 6789 [43322, 876544, 36789]
А також окремий список ідентифікаторів ...
bad_ids = [15533, 876544, 36789, 11111]
Враховуючи це, і ігноруючи df['ID']
стовпчик та будь-який індекс, я хочу перевірити, чи bad_ids
в df['Found_IDs']
колонці згадується якийсь із ідентифікаторів у списку . Код, який у мене поки що є:
df['bad_id'] = [c in l for c, l in zip(bad_ids, df['Found_IDs'])]
Це працює, але лише в тому випадку, якщо bad_ids
список довший за рамки даних і для реального набору даних цей bad_ids
список буде набагато коротшим, ніж фрейм даних. Якщо я встановив bad_ids
список лише на два елементи ...
bad_ids = [15533, 876544]
Я отримую дуже популярну помилку (я прочитав багато питань з однаковою помилкою) ...
ValueError: Length of values does not match length of index
Я спробував перетворити список у серію (жодної зміни помилки). Я також спробував додати новий стовпець і встановити всі значення, False
перш ніж робити лінію розуміння (знову ж ніякої зміни помилки).
Два питання:
- Як змусити код (нижче) працювати для списку, який коротший, ніж фрейм даних?
- Як я можу отримати код, щоб записати фактичний ідентифікатор, знайдений назад у
df['bad_id']
стовпець (корисніший за True / False)?
Очікуваний вихід для 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
Ідеальний вихід для bad_ids = [15533, 876544]
(ідентифікаторів) записується в новий стовпчик або стовпці):
ID Found_IDs bad_id
0 12345 [15443, 15533, 3433] 15533
1 15533 [2234, 16608, 12002, 7654] False
2 6789 [43322, 876544, 36789] 876544
Код:
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)