2016-10-19 6 views
0

У меня есть расчетная колонка в Pandas DataFrame, которая должна быть назначена базой при условии. Например:Условно вычисленная колонка для Pandas DataFrame

if(data['column_a'] == 0): 
    data['column_c'] = 0 
else: 
    data['column_c'] = data['column_b'] 

Однако, что возвращает ошибку:

 
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). 

У меня есть ощущение, что это что-то делать с тем, что должно быть сделано в стиле матрицы. Изменение кода в тройном заявлении также не работает:

data['column_c'] = 0 if data['column_a'] == 0 else data['column_b'] 

Кто-нибудь знает, как правильно это сделать? Использование применяется с лямбдой? Я мог бы перебирать петлю, но я предпочел бы, чтобы это было предпочтительным способом Pandas.

ответ

0

Вы можете сделать:

data['column_c'] = data['column_a'].where(data['column_a'] == 0, data['column_b']) 

это vectorised ваши попытки не увенчались успехом, так как сравнение с if не понимает, как лечить массив булевых значений, следовательно, ошибка

Пример:

In [81]: 
df = pd.DataFrame(np.random.randn(5,3), columns=list('abc')) 
df 

Out[81]: 
      a   b   c 
0 -1.065074 -1.294718 0.165750 
1 -0.041167 0.962203 0.741852 
2 0.714889 0.056171 1.197534 
3 0.741988 0.836636 -0.660314 
4 0.074554 -1.246847 0.183654 

In [82]: 
df['d'] = df['b'].where(df['b'] < 0, df['c']) 
df 

Out[82]: 
      a   b   c   d 
0 -1.065074 -1.294718 0.165750 -1.294718 
1 -0.041167 0.962203 0.741852 0.741852 
2 0.714889 0.056171 1.197534 1.197534 
3 0.741988 0.836636 -0.660314 -0.660314 
4 0.074554 -1.246847 0.183654 -1.246847 
0

использование где() и notnull()

data['column_c'] = data['column_b'].where(data['column_a'].notnull(), 0) 
Смежные вопросы