Примените функцию к каждой строке фрейма данных и сохраните данные в список / фрейм данных в Python - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть следующая упрощенная версия кода:

import pandas as pd


def myFunction(portf, Val):
    mydata = {portf: [Val, Val * 2, Val * 3, Val * 4]}
    df = pd.DataFrame(mydata, columns=[portf])
    return df


data = {'Portfolio':  ['Book1', 'Book2', 'Book1', 'Book2'],
        'Value':      [10,      5,       6,       11]}
df_input = pd.DataFrame(data, columns=['Portfolio', 'Value'])

df_output = myFunction(df_input['Portfolio'][0], df_input['Value'][0])
df_output1 = myFunction(df_input['Portfolio'][1], df_input['Value'][1])
df_output2 = myFunction(df_input['Portfolio'][2], df_input['Value'][2])
df_output3 = myFunction(df_input['Portfolio'][3], df_input['Value'][3])

Я хотел бы объединить все df_output в одном списке или, что еще лучше, в кадре данных, так как кадр данных df_input будет иметь более 100 столбцов.

Я пытался применить следующее:

df_input.apply(lambda row : myFunction(row['Portfolio'], row['Value']), axis = 1)

Однако все результаты возвращаются в один столбец.

Есть идеи, как этого добиться?

Спасибо

1 Ответ

0 голосов
/ 04 апреля 2020

Вы можете использовать pd.concat для хранения всех результатов в одном кадре данных:

pd.concat([myFunction(row['Portfolio'], row['Value']) 
           for _, row in df_input.iterrows()], axis=1)

Сначала вы создаете список pd.DataFrames с пониманием списка (вы также можете использовать обычный l oop). Затем вы объединяете все кадры данных вдоль оси = 1 .

Вывод:

    Book1   Book2   Book1   Book2
0   10      5       6       11
1   20      10      12      22
2   30      15      18      33
3   40      20      24      44

Вы упомянули, что df_input имеет намного больше строк в исходном кадре данных. Чтобы учесть это, вам нужен еще один l oop (минимальный пример):

data = {'Portfolio':  ['Book1', 'Book2', 'Book1', 'Book2'],
        'Value':      [10,      5,       6,       11]}
df_input = pd.DataFrame(data, columns=['Portfolio', 'Value'])
df_input['Value2'] = df_input['Value'] * 100

pd.concat([myFunction(row['Portfolio'], row[col]) 
           for col in df_input.columns if col != 'Portfolio'
           for (_, row) in df_input.iterrows()], axis=1)

Вывод:

    Book1   Book2   Book1   Book2   Book1   Book2   Book1   Book2
0   10      5       6       11      1000    500     600     1100
1   20      10      12      22      2000    1000    1200    2200
2   30      15      18      33      3000    1500    1800    3300
3   40      20      24      44      4000    2000    2400    4400

Возможно, вы захотите переименовать столбцы или объединить результирующий кадр данных в некоторых другой путь. Но для этого мне пришлось угадывать (и я стараюсь не угадывать перед лицом двусмысленности).

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