Skip to main content
 首页 » 编程设计

python之Pandas :使用 .isin() 返回错误: "AttributeError: float' 对象没有属性 'isin'“

2025年05月04日22zdz8207

我正在使用 Pandas 和 Python 导入一个 CSV,并对导入的数据框中的数据进行操作,以便创建一个新列。

新列中的每一行都是基于 A 列和 B 列的每个对应行中的值生成的。 数据框中有更多包含数据的列,但是这些与下面的代码无关。

导入的数据框有几千行。

A 列和 B 列均包含介于 0 和 99 之间(含)的数值。

将 pandas 导入为 pd

import csv 
 
df = pd.read_csv("import.csv", names=["Id", "Month", "Name", "ColA", "ColB" ]) 
 
def f(row): 
    if row['colA'].isin([10, 11, 12, 13, 14, 15, 20, 21, 22, 23, 24, 48]) and  row['colB'].isin([30, 31, 32, 33, 34, 35, 57, 58]): 
        val = row['ColA'] 
    elif row['ColB'].isin([10, 11, 12, 13, 14, 15, 20, 21, 22, 23, 24, 48]) and  row['ColA'].isin([30, 31, 32, 33, 34, 35, 57, 58]): 
        val = row['ColB'] 
    elif row['ColA'] > row['ColB']: 
        val = row['ColA'] 
    elif row['ColA'] < row['ColB']: 
        val = row['ColB'] 
    else:  
        val = row['ColA'] 
    return val             
 
df['NewColumnName'] = df.apply(f, axis=1)    
 
df.to_csv("export.csv", encoding='utf-8') 

运行上面的代码返回错误:

AttributeError: ("'float' object has no attribute 'isin'", 'occurred at index 0') 

显然 .isin() 不能以这种方式使用。关于如何解决这个问题有什么建议吗?

编辑 使用 Jezrael 的方法添加一个适用相同条件的列,我猜代码如下所示:

m1 = (df['colA'].isin(L1) & df['colB'].isin(L2)) | (df['ColA'] > df['ColB']) 
m2 = (df['colB'].isin(L1) & df['colA'].isin(L2)) | (df['ColA'] < df['ColB']) 
m3 = (df['colC'].isin(L1) & df['colB'].isin(L2)) | (df['ColC'] > df['ColB']) 
m4 = (df['colB'].isin(L1) & df['colC'].isin(L2)) | (df['ColC'] < df['ColB']) 
m5 = (df['colC'].isin(L1) & df['colA'].isin(L2)) | (df['ColC'] > df['ColA']) 
m6 = (df['colA'].isin(L1) & df['colC'].isin(L2)) | (df['ColC'] < df['ColA']) 
 
 
 
df['NewColumnName'] = np.select([m1, m2, m3, m4, m5, m6], [df['ColA'], df['ColB'], df['ColC'], df['ColA'], df['ColB'], df['ColC'],], default=df['ColA']) 

请您参考如下方法:

在 pandas 中最好的是避免循环,所以更好的是使用 numpy.select和 & 为 AND 和 | 为 OR 的链条件:

L1 = [10, 11, 12, 13, 14, 15, 20, 21, 22, 23, 24, 48] 
L2 = [30, 31, 32, 33, 34, 35, 57, 58] 
 
m1 = (df['colA'].isin(L1) & df['colB'].isin(L2)) | (df['ColA'] > df['ColB']) 
m2 = (df['colB'].isin(L1) & df['colA'].isin(L2)) | (df['ColA'] < df['ColB']) 
 
df['NewColumnName'] = np.select([m1, m2], [df['ColA'], df['ColB']], default=df['ColA'])