首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >熊猫:使用.isin()返回错误:"AttributeError: AttributeError‘object没有属性'isin'“

熊猫:使用.isin()返回错误:"AttributeError: AttributeError‘object没有属性'isin'“
EN

Stack Overflow用户
提问于 2018-02-18 14:39:47
回答 2查看 25.9K关注 0票数 1

我正在使用Pandas和Python导入一个CSV,并且对导入的dataframe中的数据进行操作,从而生成一个新的列。

新列中的每一行都是根据A列和B列的对应行中的值生成的。在dataframe中有更多的列具有数据,但是这些列与下面的代码无关。

导入的dataframe有几千行。

A列和B列都包含0和99之间的数值。

将熊猫作为pd导入

代码语言:javascript
复制
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')

运行上述代码将返回错误:

代码语言:javascript
复制
AttributeError: ("'float' object has no attribute 'isin'", 'occurred at index 0')

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

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

代码语言:javascript
复制
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'])
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-18 14:44:29

在熊猫中,最好的方法是避免循环,所以最好是用numpy.select&的链式条件来表示AND| for OR

代码语言:javascript
复制
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'])
票数 4
EN

Stack Overflow用户

发布于 2018-02-18 14:49:03

你需要像这样使用它:

代码语言:javascript
复制
df[df['ColA'].isin([10, 11, 12, 13, 14, 15, 20, 21, 22, 23, 24, 48])]

这将给出ColA值位于上面所示列表中的行。您正在尝试按值执行此操作,但是此方法适用于整个列。如果您想要查看这个列表中是否有一个值,那么可以使用numpy在函数中编写类似的内容:

代码语言:javascript
复制
if np.any(row['colA'] == [10, 11, 12, 13, 14, 15, 20, 21, 22, 23, 24, 48]):
   val = row['ColA']
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48852855

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档