Diyelim ki aşağıdaki veri çerçevesi (tamsayılar sütunu ve tamsayıların listesini içeren bir sütun) ...
ID Found_IDs
0 12345 [15443, 15533, 3433]
1 15533 [2234, 16608, 12002, 7654]
2 6789 [43322, 876544, 36789]
Ayrıca ayrı bir kimlik listesi ...
bad_ids = [15533, 876544, 36789, 11111]
Bu göz önüne alındığında ve df['ID']
sütun ve herhangi bir dizini göz ardı ederek , bad_ids
listedeki kimliklerden herhangi birinin df['Found_IDs']
sütunda belirtilip belirtilmediğini görmek istiyorum . Şimdiye kadar var kod:
df['bad_id'] = [c in l for c, l in zip(bad_ids, df['Found_IDs'])]
Bu işe yarar, ancak bad_ids
liste veri çerçevesinden daha uzunsa ve gerçek veri kümesi için bad_ids
liste veri çerçevesinden çok daha kısa olacaktır. bad_ids
Listeyi yalnızca iki öğeye ayarlarsam ...
bad_ids = [15533, 876544]
Çok popüler bir hata alıyorum (aynı hatayla birçok soru okudum) ...
ValueError: Length of values does not match length of index
Liste bir dizi (hata hiçbir değişiklik) dönüştürme denedim. Ben de yeni sütun ekleme ve False
anlama hattı (yine hata hiçbir değişiklik) yapmadan önce tüm değerleri ayarlama denedim .
İki soru:
- Veri çerçevesinden daha kısa bir liste için kodumu (aşağıda) nasıl çalıştırabilirim?
- Kolona geri bulunan gerçek kimliği yazmak için kodu nasıl alabilirim
df['bad_id']
(Doğru / Yanlış'dan daha yararlı)?
İçin beklenen çıktı 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]
(Kimlik (ler) için ideal çıktı yeni bir sütuna veya sütunlara yazılır):
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)