使用if else语句的输出创建新列会导致错误

时间:2016-01-13 05:52:52

标签: python if-statement pandas dataframe

我使用以下代码,

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

有人可以帮我找到错误吗?

5 个答案:

答案 0 :(得分:2)

我认为最好使用locisin,因为您无法将标量与使用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()