Используя if и elif правильный путь - PullRequest
0 голосов
/ 30 января 2020

У меня есть следующий фрейм данных:

df1=pd.DataFrame([1,2,3], columns=["a"])

, что приводит к:

    a
0   1
1   2
2   3

Я хочу создать столбец b, где каждое значение кратно (x2, x3, x4) соответствующего номера в столбце а. Желаемый результат выглядит так:

    a   b
0   1   2
1   2   6
2   3   12

Я пытаюсь сделать следующее утверждение, но, очевидно, поведение не такое, как ожидалось.

for num in df1["a"]:
    if a == 1:
        df1["b"]=df1["a"]*2
    elif a == 2:
        df1["b"]=df1["a"]*3
    elif a ==3:
        df1["b"]=df1["a"]*4

когда я запускаю вышеупомянутое, я получаю:

    a   b
0   1   2
1   2   4
2   3   6

помощь, высоко ценится

Ответы [ 3 ]

1 голос
/ 30 января 2020

вы хотите (верхний ответ лучше, но так вы бы поступили в if-elif)

 if num == 1
    ...
 elif num == 2
    ...
 elif num == 3
    ...
1 голос
/ 30 января 2020

Я бы посоветовал вам использовать векторизованные опции: numpy select достаточно хорошо подходит для вашего случая использования:

cond1 = df['a']==1
cond2 = df['a']==2
cond3 = df['a']==3
condlist=[cond1,cond2,cond3]
choicelist=[df.a*2,df.a*3, df.a*4]
df['b']=np.select(condlist,choicelist)

    a   b
 0  1   2
 1  2   6
 2  3   12

Примечание: я бы go предложил предложения в комментариях приступая к этому. Чем проще, тем лучше.

0 голосов
/ 30 января 2020

Вы умножаете весь фрейм данных при запуске df1['b']=df1['a']*2, вместо этого вам нужно умножить каждый элемент df1['b'][0]=df1['a'][0]*2.

Так ваш код будет выглядеть так

# Start by initialising column 'b'.
df1['b'] = df1['a']

for i in range(len(df1["b"])):
    if df1["a"][i] == 1:
        df1["b"]=df1["a"]*2
    elif df1["a"][i] == 2:
        df1["b"]=df1["a"]*3
    elif df1["a"][i] == 3:
        df1["b"]=df1["a"]*4

Я точно не знаю, к чему вы стремитесь, но если вы хотите продолжить шаблон, ваш код будет выглядеть следующим образом: c case

df1['b'] = df1['a']

for i in range(len(df1["b"])):
    df1["b"][i]=df1["b"][i]*(num+1)

Редактировать: Старый ответ не был правильное решение.

...