我有以下简化的代码版本:
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)
但是所有结果都返回到一列。
有什么想法要实现吗?
谢谢
答案 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
您可能想以其他方式重命名列或聚合结果数据框。但是为此我不得不猜测(面对歧义时,我尽量不要猜测)。