我使用以下代码,
if(df.month == 3 or df.month == 4 or df.month == 5):
df.test = 'A'
elif(df.month == 6 or df.month == 7 or df.month == 8):
df.test = 'B'
else:
df.test = 'C'
但是在使用它时,我收到以下错误,
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
更新:
print df.columns
Unnamed: 0 int64
year int64
month int64
day int64
dep_time float64
dep_delay float64
arr_time float64
arr_delay float64
carrier object
tailnum object
flight int64
origin object
dest object
air_time float64
distance int64
hour float64
minute float64
print df.dtypes
dtype: object
有人可以帮我找到错误吗?
答案 0 :(得分:2)
我认为最好使用loc
和isin
,因为您无法将标量与使用function createADateArray(){
var arr = [];
temparr = [];
var date = new Date();
arr.push(temparr);
temparr = [];
for(i=1; i < 6; i++){
var date2 = date.setDate(date.getDate() + 1);
var cdate = d3.time.format('%A %m/%d/%y')(new Date(date2))
var obj = {
'x': cdate,
'y': i
}
temparr.push(obj);
}
arr.push(temparr);
// }
return arr;
}
或if
的数组进行比较,因此它变得模棱两可:
elif
或者您可以通过值print df
year month day
0 2005 3 20
1 2005 4 20
2 2005 5 20
3 2005 6 20
4 2005 7 20
5 2005 8 20
6 2005 9 20
df['test'] = 'C'
df.loc[df['month'].isin([3,4,5]) , 'test'] = 'A'
df.loc[df['month'].isin([6,7,8]) , 'test'] = 'B'
print df
year month day test
0 2005 3 20 A
1 2005 4 20 A
2 2005 5 20 A
3 2005 6 20 B
4 2005 7 20 B
5 2005 8 20 B
6 2005 9 20 C
以这种方式填充列test
:
C
答案 1 :(得分:0)
您可以使用理解来创建test
列:
>>> df = pd.DataFrame({'month' : pd.Series(range(1,13))})
>>> df['test'] = ['A' if m in [3,4,5] else
... 'B' if m in [6,7,8] else
... 'C' for m in df['month']]
>>> df
month test
0 1 C
1 2 C
2 3 A
3 4 A
4 5 A
5 6 B
6 7 B
7 8 B
8 9 C
9 10 C
10 11 C
11 12 C
或者您可以应用一个产生相同结果的函数:
>>> def value(month):
... if month in [3,4,5]:
... return 'A'
... if month in [6,7,8]:
... return 'B'
... return 'C'
>>> df['test'] = df['month'].apply(value)
答案 2 :(得分:0)
尝试
def valuesetter(x):
if x in [3,4,5]: return "A"
elif x in [6,7,8]: return "B"
else: return "C"
df["test"] = list(map(valuesetter,df.month))
答案 3 :(得分:0)
您获得的异常消息非常自我解释。 df ['month']是一个系列,并且系列的真值是不明确的,因为它代表了一系列真值。您可以使用pd.Series.map
def assignmentFunction(value):
if value in [3, 4, 5]:
return 'A'
elif value in [6, 7, 8]:
return 'B'
else:
return 'C'
df['test'] = df['month'].map(assignmentFunction)
答案 4 :(得分:-1)
这个答案主要是试图解释你所看到的错误。由于我不是pandas
用户,我会让其他答案说明更好的方法来编写此代码......
df.month
返回一个数组。 some_array == 6
将返回另一个数组(构造为new_array[i] == True
iff some_array[i] == 6
)。
由于这种情况,在numpy中,数组没有真值(与普通的python序列不同)。因此,要测试数组是否真实,您需要指定您的意思。例如要指定所有元素必须是真实的,您需要:(df.month == 6).all()