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

标签 python pandas csv dataframe

我正在使用 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'])

关于python - Pandas :使用 .isin() 返回错误: "AttributeError: float' 对象没有属性 'isin'“,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48852855/

相关文章:

python - 比较两个不同长度的数据帧中的值后添加列

python - pandas:从分组数据框中排序和删除行

PHP CURL 登录和下载文件代码不起作用

python - 如何使用 scala 或 python 在 apache spark 中运行多线程作业?

python - 读/写/解析大文本文件的有效方法(python)

python - 根据外键函数过滤 Django GenericRelation

ios - SwiftCSV 错误查找 .csv 文件

python - 我想将数据框的行附加为列

string - 如何在python中生成随机字母?

python 功能来解析包含表的 csv 文件