我有一列名为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来重现此数据。