2017-01-31 8 views
2

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

Вот мой подход, который работает для возвращения одного столбца, но не кратно:

Вот мой DataFrame:

d = {'a': [3,0,2,2], 
    'b': [0,1,2,3], 
    'c': [1,1,2,3], 
    'd': [2,2,1,3]} 

df = pd.DataFrame(d) 

Я пытаюсь применить эту функцию:

def myfunc(a,b,c): 
    if a > 2 and b > 2: 
     print('condition 1',a,b) 
     return pd.Series((a,b)) 
    elif a < 2 and c < 2: 
     print('condition 2',a,c) 
     return pd.Series((b,c)) 
    else: 
     print('no condition') 
     return pd.Series((None,None)) 

НЕТ:

df['e'],df['f'] = df.apply(lambda x: myfunc(x['a'],x['b'],x['c']),axis=1) 

Выход:

no condition 
no condition 
condition 2 0 1 
no condition 
no condition 

DataFrame результат:

enter image description here

Как я могу ввода нескольких столбцов и получить несколько столбцов из?

ответ

2

Этот вопрос с назначением, не myfunc

При попытке распаковать dataframe как кортеж, он возвращает Lables столбцов. Вот почему вы получите (0, 1) для всего

df['e'], df['f'] = pd.DataFrame([[8, 9]] * 1000000, columns=['Told', 'You']) 
print(df) 

    a b c d  e f 
0 3 0 1 2 Told You 
1 0 1 1 2 Told You 
2 2 2 2 1 Told You 
3 2 3 3 3 Told You 

Использование join

df.join(df.apply(lambda x: myfunc(x['a'],x['b'],x['c']),axis=1)) 

Или pd.concat

pd.concat([df, df.apply(lambda x: myfunc(x['a'],x['b'],x['c']),axis=1)], axis=1) 

оба дают

a b c d e f 
0 3 0 1 2 NaN NaN 
1 0 1 1 2 1.0 1.0 
2 2 2 2 1 NaN NaN 
3 2 3 3 3 NaN NaN 
+0

Интересно, я подумал об этом сначала, но когда я его протестировал, я получил две колонки с NA естественно (тогда я подумал, что еще одна магия от панд) – Boud

+0

Это дает мне странный результат. Если одно из условий истинно, оно заполняет все значения для новых столбцов с этим выводом вместо «Нет». – sparrow

+0

@sparrow вам придется обновлять данные, которые вы фактически используете, это, похоже, работает на меня. Также обратите внимание, что у меня есть «Нет».Но 'pandas' сделает это' NaN' – piRSquared

2

Ваша функция будет возвращена одна серия с NAs или с 2-мя корнями, когда my_funct соответствует.

Один из способов исправить это является возвращение серии вместо этого, который будет автоматически расширен применять:

def myfunc(col1,col2,col3): 
    if col1 == 'x' and col2 == 'y': 
     return pd.Series((col1,col2)) 
    if col2 == 'a' and col3 == 'b': 
     return pd.Series(('yes','no')) 

Примечание двойные скобки, чтобы передать один аргумент в виде кортежа. Список тоже будет хорош.

+0

Благодаря Boud, когда я вернусь как серия или список, я все еще получаю sa me Ошибка значения. – sparrow

+0

Тогда вы делаете что-то не так, или проблема и df, которые вы описываете в своем вопросе, не являются вашей реальной реальностью, и у вас есть еще одна проблема. – Boud

+1

Boud, я отредактировал мой вопрос, чтобы быть более понятным. Если вы видите, что я делаю неправильно, то, пожалуйста, дайте мне знать. – sparrow