Katakanlah saya memiliki kerangka data berikut (kolom bilangan bulat dan kolom dengan daftar bilangan bulat) ...
ID Found_IDs
0 12345 [15443, 15533, 3433]
1 15533 [2234, 16608, 12002, 7654]
2 6789 [43322, 876544, 36789]
Dan juga daftar ID yang terpisah ...
bad_ids = [15533, 876544, 36789, 11111]
Mengingat itu, dan mengabaikan df['ID']
kolom dan indeks apa pun, saya ingin melihat apakah ada ID dalam bad_ids
daftar yang disebutkan dalam df['Found_IDs']
kolom. Kode yang saya miliki sejauh ini adalah:
df['bad_id'] = [c in l for c, l in zip(bad_ids, df['Found_IDs'])]
Ini berfungsi tetapi hanya jika bad_ids
daftar lebih panjang dari kerangka data dan untuk dataset nyata bad_ids
daftar akan jauh lebih pendek daripada kerangka data. Jika saya mengatur bad_ids
daftar hanya dua elemen ...
bad_ids = [15533, 876544]
Saya mendapatkan kesalahan yang sangat populer (saya telah membaca banyak pertanyaan dengan kesalahan yang sama) ...
ValueError: Length of values does not match length of index
Saya telah mencoba mengubah daftar menjadi seri (tidak ada perubahan dalam kesalahan). Saya juga telah mencoba menambahkan kolom baru dan mengatur semua nilai False
sebelum melakukan garis pemahaman (sekali lagi tidak ada perubahan dalam kesalahan).
Dua pertanyaan:
- Bagaimana cara mendapatkan kode saya (di bawah) berfungsi untuk daftar yang lebih pendek dari kerangka data?
- Bagaimana saya mendapatkan kode untuk menulis ID aktual yang ditemukan kembali ke
df['bad_id']
kolom (lebih berguna daripada Benar / Salah)?
Output yang diharapkan untuk 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 ideal untuk bad_ids = [15533, 876544]
(ID) ditulis ke kolom atau kolom baru):
ID Found_IDs bad_id
0 12345 [15443, 15533, 3433] 15533
1 15533 [2234, 16608, 12002, 7654] False
2 6789 [43322, 876544, 36789] 876544
Kode:
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)