将函数应用于数据框的每一行,并将数据存储到Python中的列表/数据框

时间:2020-04-02 20:15:35

标签: python-3.x pandas dataframe

我有以下简化的代码版本:

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 :(得分:0)

您可以使用pd.concat将所有结果存储在单个数据框中:

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

首先,您需要使用列表理解功能构建pd.DataFrames列表(您也可以使用普通循环)。然后,沿 axis = 1 合并所有DataFrame。

输出:

    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在原始数据帧中还有更多行。为了解决这个问题,您需要进行另一个循环(最小示例):

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

您可能想以其他方式重命名列或聚合结果数据框。但是为此我不得不猜测(面对歧义时,我尽量不要猜测)。

相关问题