Digamos que eu tenha o seguinte quadro de dados (uma coluna de números inteiros e uma coluna com uma lista de números inteiros) ...
ID Found_IDs
0 12345 [15443, 15533, 3433]
1 15533 [2234, 16608, 12002, 7654]
2 6789 [43322, 876544, 36789]
E também uma lista separada de IDs ...
bad_ids = [15533, 876544, 36789, 11111]
Dado isso, e ignorando a df['ID']
coluna e qualquer índice, quero ver se algum dos IDs na bad_ids
lista é mencionado na df['Found_IDs']
coluna. O código que tenho até agora é:
df['bad_id'] = [c in l for c, l in zip(bad_ids, df['Found_IDs'])]
Isso funciona, mas apenas se a bad_ids
lista for maior que o quadro de dados e, para o conjunto de dados real, a bad_ids
lista será muito menor que o quadro de dados. Se eu definir a bad_ids
lista para apenas dois elementos ...
bad_ids = [15533, 876544]
Recebo um erro muito popular (li muitas perguntas com o mesmo erro) ...
ValueError: Length of values does not match length of index
Eu tentei converter a lista em uma série (nenhuma alteração no erro). Eu também tentei adicionar a nova coluna e definir todos os valores False
antes de fazer a linha de compreensão (novamente nenhuma alteração no erro).
Duas questões:
- Como faço para que meu código (abaixo) funcione para uma lista mais curta que um dataframe?
- Como eu obteria o código para gravar o ID real encontrado de volta na
df['bad_id']
coluna (mais útil que Verdadeiro / Falso)?
Saída prevista para 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
A saída ideal para bad_ids = [15533, 876544]
(ID) é gravada em uma nova coluna ou colunas:
ID Found_IDs bad_id
0 12345 [15443, 15533, 3433] 15533
1 15533 [2234, 16608, 12002, 7654] False
2 6789 [43322, 876544, 36789] 876544
Código:
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)