สมมติว่าฉันมี dataframe ต่อไปนี้ (คอลัมน์จำนวนเต็มและคอลัมน์ที่มีรายการจำนวนเต็ม) ...
ID Found_IDs
0 12345 [15443, 15533, 3433]
1 15533 [2234, 16608, 12002, 7654]
2 6789 [43322, 876544, 36789]
และยังมีรายการ ID แยกต่างหาก ...
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
รายการนั้นยาวกว่า dataframe และสำหรับชุดข้อมูลจริงbad_ids
รายการนั้นจะสั้นกว่า dataframe มาก ถ้าฉันตั้งค่าbad_ids
รายการเป็นสององค์ประกอบเท่านั้น ...
bad_ids = [15533, 876544]
ฉันได้รับข้อผิดพลาดที่นิยมมาก (ฉันได้อ่านคำถามมากมายด้วยข้อผิดพลาดเดียวกัน) ...
ValueError: Length of values does not match length of index
ฉันได้ลองแปลงรายการเป็นซีรี่ส์ (ไม่มีการเปลี่ยนแปลงข้อผิดพลาด) ฉันได้ลองเพิ่มคอลัมน์ใหม่และตั้งค่าทั้งหมดเป็นFalse
ก่อนที่จะทำบรรทัดความเข้าใจ (อีกครั้งไม่มีการเปลี่ยนแปลงข้อผิดพลาด)
สองคำถาม:
- ฉันจะทำให้โค้ดของฉัน (ด้านล่าง) ทำงานกับรายการที่สั้นกว่าดาต้าเฟรมได้อย่างไร
- ฉันจะได้รับรหัสเพื่อเขียน ID จริงกลับไปที่
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) ถูกเขียนไปยังคอลัมน์หรือคอลัมน์ใหม่:
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)