所以我有一个包含三列的df:第一列包含名称,第二列包含ID,第三列包含ID列表(以逗号分隔)。对于在第一列中具有相同名称的人,我想检查一个人的第二列中的ID是否出现在另一个人的第三列中的ID列表中。
name id id2
Gabor 665 123
Hoak 667 100,111,112
Sherr 668 1,2,3
Hoak 669 667,500,600
Rine 670 73331,999
Rine 671 670,15
所以基本上我想让python注意到有两个人叫“ Hoak”,并检查Hoak No.1的id 667是否出现在另一个Hoak的id2列表中(确实如此)。我试图从一种便宜的方法开始,它以我指定的任何名称手动进行操作,比如说“ Hoak”(i = 1):
import pandas as pd
df = pd.read_excel (...)
for i in range(0,len(df)):
if df['name'][i] == df['name'][1]:
if df['id'][1] in df['id2'][i]:
print(i)
但是,我得到
TypeError:“ float”类型的参数不可迭代
我尝试添加各种变体,例如 .string 或 str(),或者if (df ['id2'] [i])。str.contains(“ 667”),但我无法解决,出现了类似的错误
AttributeError:“ float”对象没有属性“ string”
感谢您的帮助
答案 0 :(得分:2)
您需要在dtype
中设置read_excel
以避免浮动问题。
要强制使用的数据类型。仅允许单个dtype。如果没有,则推断
import pandas as pd
import numpy as np
df = pd.read_excel(io="test.xls", header=0, dtype={'name': np.str, 'id': np.str, 'id2': np.str})
for i in range(0,len(df)):
if df['name'][i] == df['name'][1]:
if df['id'][1] in df['id2'][i]:
print(i)
接下来,您需要纠正搜索算法。
答案 1 :(得分:1)
另一种熊猫风格的方法是按名称对行进行分组,并查看每个组中所有ID的集合是否与同一组中所有ID2的集合相交:
df['id2'] = df['id2'].astype(str).str.split(',').apply(set)
df['id'] = df['id'].astype(str) # if needed
df.groupby('name')\
.apply(lambda x: set(x['id']) & set.union(*x['id2']))
#name
#Gabor {}
#Hoak {667}
#Rine {670}
#Sherr {}
答案 2 :(得分:0)
尝试改变这种情况
Plugin Messaging Channel
与此
if df['id'][1] in df['id2'][i]:
问题可能是,当您仅浏览带有一个值的行时,它不会将其视为列表,而是一个浮点值,因此您无法对其进行迭代
答案 3 :(得分:-1)
df = pd.read_excel
以浮动形式显示。您是否尝试仅在第一个循环中打印出i
?该错误消失后,继续通过嵌套的for循环工作。
要解决第一个错误,您需要在dtype
中设置read_excel
以避免浮动问题。