使用来自多列的条件创建变量(PANDAS)

问题描述:

我有一个名为HouseholdSize的列和一个名为Independent的列。我想,如果HouseholdSize等于1创建一个变量等于1和独立不等于1.我当前的代码如下所示:使用来自多列的条件创建变量(PANDAS)

 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的:“浮动”对象有没有属性'全部'

编辑:在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。对于第三种情况,如果你想要一个指标列,那么你可以使用np.where HH1flag应该等于1

+1

你这样做是否正确?你没有说明哪一行会抛出错误,我假设它是第一行,因为它看起来很奇怪,你是不是想要这个:'df [“HH1flag”] = df.where((df.HouseholdSize == 1)&(df.Independent!= 1))。notnull()。astype(int)'? – EdChum 2015-03-02 16:01:56

+0

嗨EdChum。对不起,没有指定,它是引发错误的第一行。我试着将你的评论中的代码粘贴到我的代码中,并且我得到了同样的错误。有什么想法可能造成这种情况? – lbug 2015-03-02 16:16:39

+0

你可以发布原始输入数据和代码来创建df,所以我们可以重现你的错误,谢谢 – EdChum 2015-03-02 16:23:49

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

所以这种使用状况所传递的,如果真返回1,如果为假它返回0.

我的第一个建议没有奏效的原因是因为这会返回一个包含多个列值的系列,这不是您想要的。

当你做df.where它不喜欢想投你的系列,并提出了AttributeError

AttributeError: 'float' object has no attribute 'all'

我不知道为什么这样做,没有什么特别的关于您的数据,因为我是能够用一个简单的df组合来重现这一点。

+0

嗨EdChum, 快速的问题。我曾尝试使用带有三列的“or”语句,代码如下所示:df [“NCP2flag”] = np.where((df.NCPFlag == 1)&((df.NCPIncReported == -999)或(df.NCPPCReported == -999)),1,0) 我收到一个错误:ValueError:一个Series的真值是不明确的。使用a.empty,a.bool(),a。item(),a.any()或a.all()。有没有办法重写这条线来绕过这个?我知道这一点已经变得非常具体,但我非常感谢你的帮助! – lbug 2015-03-02 21:40:37

+1

当你比较数组时,你不能使用'和','或',因此你必须使用按位运算符的错误:'df [“NCP2flag”] = np.where((df.NCPFlag == 1) &((df.NCPIncReported == -999)|(df.NCPPCReported == -999)),1,0)' – EdChum 2015-03-02 21:49:36