如何在pandas数据框中将前一行的列中的值添加到当前行的列中的值?

2lpgd968  于 2023-03-21  发布在  其他
关注(0)|答案(1)|浏览(159)

假设我有以下pandas dataframe:
| 主队|客场球队|主队主场胜|客场球队客场获胜|
| - ------|- ------|- ------|- ------|
| 酒吧|MNU|四个|三个|
| 风险管理|酒吧|六个|五个|
| MNU|瑞士|第二章|三个|
| 瑞士|风险管理|四个|四个|
我想添加另一个名为Home Team Total Wins的列,其预期结果如下:
| 主队|客场球队|主队总胜数|
| - ------|- ------|- ------|
| 酒吧|MNU|四个|
| 风险管理|酒吧|六个|
| MNU|瑞士|五个|
| 瑞士|风险管理|七|
逻辑是,在每一行,通过数据框向后搜索最后一行,其中客场队等于当前行的主队。然后,从该行中获取客场队客场胜利并将其添加到当前行的主队主场胜利。例如,在第三行中,我们找到最后一行,其中客场队== 'MNU',获取其客场队客场胜利值,并将其添加到Home Team Home Wins值以创建新列(因此我们获得2+3 = 5)。
我尝试过使用df.apply来实现这一点,但到目前为止还没有成功。有没有办法在pandas中实现这一点,或者我需要回到绘图板并使用不同的数据结构?

dba5bblo

dba5bblo1#

我想出了一个使用mask和for循环的解决方案。这似乎是预期的工作,但好吧,没有for循环的解决方案会更好!

from tabulate import tabulate
import pandas as pd

df = pd.DataFrame({'Home Team':['BAR', 'RMD', 'MNU', 'CHE'],
                   'Away Team':['MNU', 'BAR', 'CHE', 'RMD'],
                   'Home Team Home Wins':[4, 6, 2, 4],
                   'Away Team Away Wins':[3, 5, 3, 4]})

df['Home Team Total Wins'] = None
for i in range(len(df)):
    home_team = df.iloc[i, df.columns.get_loc('Home Team')]
    idx_teams = [df.columns.get_loc('Home Team'), df.columns.get_loc('Away Team')]
    mask = df.iloc[:i+1, idx_teams].values == home_team
    idx_wins = [df.columns.get_loc('Home Team Home Wins'), df.columns.get_loc('Away Team Away Wins')]
    total_wins = df.iloc[:i+1, idx_wins].values[mask].sum()
    df.iloc[i, df.columns.get_loc('Home Team Total Wins')] = total_wins

print(tabulate(df, headers='keys', tablefmt='psql'))

输出:

+----+-------------+-------------+-----------------------+-----------------------+------------------------+
|    | Home Team   | Away Team   |   Home Team Home Wins |   Away Team Away Wins |   Home Team Total Wins |
|----+-------------+-------------+-----------------------+-----------------------+------------------------|
|  0 | BAR         | MNU         |                     4 |                     3 |                      4 |
|  1 | RMD         | BAR         |                     6 |                     5 |                      6 |
|  2 | MNU         | CHE         |                     2 |                     3 |                      5 |
|  3 | CHE         | RMD         |                     4 |                     4 |                      7 |
+----+-------------+-------------+-----------------------+-----------------------+------------------------+

相关问题