如果满足条件,则在整数列表中查找整数

时间:2019-05-09 21:44:34

标签: python

所以我有一个包含三列的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”

感谢您的帮助

4 个答案:

答案 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以避免浮动问题。