我有一列名为HouseholdSize和一列名为Independent。我想创建一个等于1的变量,如果HouseholdSize等于1且Independent不等于1。我当前的代码如下所示:

        df["HH1flag"] = df.where((df.HouseholdSize ==1) & (df.Independent != 1).notnull().astype(int))
            HH1flag = df[df.HH1flag == 1]
            pd.DataFrame(HH1flag, columns=["LocIdent","HouseholdSize","Independent"]).to_csv(Targcsv, mode='ab')


我收到以下错误:
AttributeError:“ float”对象没有属性“ all”

编辑:在EdChum的一些帮助下,我向该问题添加了更多信息。我修改后的代码的简化版本如下所示:

import pandas as pd
from pandas import *
import csv

FileName='HouseholdSizeTest.xlsx'
data=pd.read_excel(FileName,'Sheet1')
df=pd.DataFrame(data)
Targcsv=('target.csv')

HH1Text= [['Table C.1 HouseholdSize Check 1']]
with open(Targcsv,'ab') as f:
    titles=csv.writer(f)
    titles.writerow([])
    titles.writerows(HH1Text)
    titles.writerow([])

df["HH1flag"] = df[(df.HouseholdSize ==1) & (df.Independent != 1)].notnull().astype(int)
HH1flag = df[df.HH1flag == 1]
pd.DataFrame(HH1flag, columns=["LocIdent","HouseholdSize","Independent"]).to_csv(Targcsv, mode='ab')


对于同一行,我收到一个新错误。错误是ValueError:传递了错误的项目数3,位置表示1。我正在努力将数据正确地放入此编辑中,但设想三种情况。第一个具有Independent = 1和HouseholdSize = 1,第二个具有Independent = 0和HouseholdSize = 3,第三个具有Independent = 47和HouseholdSize = 1。对于第三种情况,HH1flag应等于1。

最佳答案

如果要使用指标列,则可以使用np.where

df["HH1flag"] = np.where((df.HouseholdSize ==1) & (df.Independent != 1), 1, 0)


因此,它使用传入的条件,如果为true,则返回1;如果为false,则返回0。

我的第一个建议不起作用的原因是,这将返回具有多个列值的序列,这不是您想要的。

当您执行df.where时,它不喜欢尝试投射系列并引发AttributeError


  AttributeError:“ float”对象没有属性“ all”


我不知道为什么这样做,您的数据没有什么特别之处,因为我能够使用仅由整数组成的简单df来重现此数据。

10-04 13:34