Добавление нескольких столбцов в pandas df на основе значений строк - PullRequest
1 голос
/ 17 июня 2020

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

Например, у меня есть эта тестовая функция, которая выводит 2 значения:

def testfunc (TranspoId, LogId):
    thing1 = TranspoId + LogId
    thing2 = LogId - TranspoId
    return thing1, thing2

Я могу передать эти возвращенные результаты в 2 разные переменные, например:

Thing1,Thing2 = testfunc(4,28)
print(Thing1)
print(Thing2)

Я пытался сделать это с фреймом данных следующим образом:

data = {'Name':['Picard','Data','Guinan'],'TranspoId':[1,2,3],'LogId':[12,14,23]}

df = pd.DataFrame(data, columns = ['Name','TranspoId','LogId'])
print(df)

df['thing1','thing2'] = df.apply(lambda row: testfunc(row.TranspoId, row.LogId), axis=1)
print(df)

Я хочу, чтобы это выглядело примерно так:

data = {'Name':['Picard','Data','Guinan'],'TranspoId':[1,2,3],'LogId':[12,14,23], 'Thing1':[13,16,26], 'Thing2':[11,12,20]}
df = pd.DataFrame(data, columns=['Name','TranspoId','LogId','Thing1','Thing2'])
print(df)

В реальном мире эта функция выполняет много тяжелой работы, и я не могу позволить себе запускать его дважды, один раз для каждой новой переменной, добавляемой в df.

Я бью себя этим несколько часов. Приветствуются любые идеи.

Ответы [ 2 ]

1 голос
/ 18 июня 2020

Ваша функция должна возвращать серию, которая вычисляет новые столбцы за один проход. Затем вы можете использовать pandas .apply () для добавления новых полей.

import pandas as pd
df = pd.DataFrame( {'TranspoId':[1,2,3], 'LogId':[4,5,6]})

def testfunc(row):
    new_cols = pd.Series([
       row['TranspoId'] + row['LogId'],
       row['LogId'] - row['TranspoId']]) 
    return new_cols

df[['thing1','thing2']] = df.apply(testfunc, axis = 1)

print(df)

Вывод:

   TranspoId  LogId  thing1  thing2
0          1      4       5       3
1          2      5       7       3
2          3      6       9       3
1 голос
/ 17 июня 2020

Я считаю, что лучший способ - изменить порядок и сделать функцию, которая работает с Series.

import pandas as pd

# Create function that deals with series
def testfunc (Series1, Series2):
    Thing1 = Series1 + Series2
    Thing2 = Series1 - Series2
    return Thing1, Thing2

# Create df
data = {'Name':['Picard','Data','Guinan'],'TranspoId':[1,2,3],'LogId':[12,14,23]}    
df = pd.DataFrame(data, columns = ['Name','TranspoId','LogId'])

# Apply function
Thing1,Thing2 = testfunc(df['TranspoId'],df['LogId'])
print(Thing1)
print(Thing2)

# Assign new columns
df = df.assign(Thing1 = Thing1)
df = df.assign(Thing2 = Thing2)

# print df
print(df)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...