2014-11-12 15 views
1

Я пытаюсь создать новый столбец в моем DataFrame.Использовать сумму нескольких столбцов pandas при сопоставлении функции

Я хочу, чтобы новый столбец был * b, если сумма нескольких других столбцов равна == 0, 1, если сумма равна == 1 и 0 в противном случае.

Число столбцов, которые я суммирую, является динамическим, так как это могут быть 3 столбца, которые я суммирую, или это может быть 100. У меня есть список этих имен столбцов (list_to_check), которые могут быть любой длины.

df = pd.DataFrame({'a': [1,2,3], 'b': [2,3,4], 'c':['dd','ee','ff'], 'd1':[5,0,1], 'd2':[5,0,1], 'dn':[5,0,1]}) 

list_to_check = ['d1','d2','dn'] 

def func(a,b,c): 
    if sum(c) == 0: 
     a*b 
    elif sum(c) == 1: 
     1 
    else: 
     0 

df['new_column'] = np.vectorize(func)(df.a,df.b,df[list_to_check]) 

ответ

1
vals = df[list_to_check].sum(1) 
df['new_col'] = 0 
df.loc[vals == 0, 'new_col'] = df.a * df.b 
df.loc[vals == 1, 'new_col'] = 1 
+0

Было бы хорошо, если бы вы включили объяснение с вашим ответом, а не только код. –

+1

Perfect. Я не знал о df.loc, и этот пример действительно заполнил довольно много пробелов, которые мне не хватало. Спасибо за вашу помощь! – Chris

+0

приятно слушать @chris. Да, в пандах есть определенные странные углы индексации. (например, мне приходилось использовать 'slice (None)' более одного раза) – acushner

 Смежные вопросы

  • Нет связанных вопросов^_^