Python将使用来自同一DF的其他列的值创建新列

Python将使用来自同一DF的其他列的值创建新列,python,pandas,conditional-statements,Python,Pandas,Conditional Statements,这是一个漫长的夜晚寻找解决方案,我感谢你的帮助 具有以下特征 提议的1_金额 提议的2_金额 提议的3_金额 已接受的建议 1000 2000 3000 3. 5000 5200 4000 2. 3000 2400 1120 1. 我能想到的最快解决方案是: df['accepted_amount'] = df.apply(lambda row: row.iloc[row['accepted_proposal']-1],axis=1) 编辑:因为我觉得解决方案取决于列的顺序并不容易,所以这里有

这是一个漫长的夜晚寻找解决方案,我感谢你的帮助

具有以下特征

提议的1_金额 提议的2_金额 提议的3_金额 已接受的建议 1000 2000 3000 3. 5000 5200 4000 2. 3000 2400 1120 1.
我能想到的最快解决方案是:

df['accepted_amount'] = df.apply(lambda row: row.iloc[row['accepted_proposal']-1],axis=1)
编辑:因为我觉得解决方案取决于列的顺序并不容易,所以这里有一个稍微冗长但更动态的解决方案:

df['accepted_amount']=df.apply(lambda row: row[['proposal1_amount','proposal2_amount','proposal3_amount']].iloc[row['accepted_proposal']-1],axis=1)

我能想到的最快解决方案是:

df['accepted_amount'] = df.apply(lambda row: row.iloc[row['accepted_proposal']-1],axis=1)
编辑:因为我觉得解决方案取决于列的顺序并不容易,所以这里有一个稍微冗长但更动态的解决方案:

df['accepted_amount']=df.apply(lambda row: row[['proposal1_amount','proposal2_amount','proposal3_amount']].iloc[row['accepted_proposal']-1],axis=1)
你可以使用numpy。选择这样做很容易

print(df)
   proposal1_amount  proposal2_amount  proposal3_amount  accepted_proposal
0              1000              2000              3000                  3
1              5000              5200              4000                  2
2              3000              2400              1120                  1
np.choose将在功能上迭代每一行选项,例如迭代每一个提案n_金额,然后从接受的提案-1中获取与索引匹配的金额。查看文档,您可以使用numpy。选择此操作非常简单

print(df)
   proposal1_amount  proposal2_amount  proposal3_amount  accepted_proposal
0              1000              2000              3000                  3
1              5000              5200              4000                  2
2              3000              2400              1120                  1

np.choose将在功能上迭代每一行选项,例如迭代每一个提案n_金额,然后从接受的提案-1中获取与索引匹配的金额。查看文档以了解

谢谢,工作非常完美。在一个500000行的数据集上需要几分钟的时间,但它一点也不坏。是的,它肯定可以通过使用一个或两个矢量化操作来优化,而不是应用,我只是想尽快得到一个解决方案。谢谢,工作得非常好。在一个500000行的数据集上需要几分钟的时间,但一点也不差。是的,它肯定可以通过使用一个或两个矢量化操作来优化,而不是应用,我只是想尽快得到一个解决方案。