如何基于单列值在熊猫中动态更新两列?

时间:2020-07-08 17:57:09

标签: pandas dataframe

我有如下数据框。我想添加两列winning_team和lossing_team。如何根据主场得分和客场得分条件填充这些列?我想一次更新一下winning_team和lossing_team列。

         date home_team away_team  home_score  away_score tournament
0  1872-11-30  Scotland   England           0           0   Friendly
1  1873-03-08   England  Scotland           4           2   Friendly
2  1874-03-07  Scotland   England           2           1   Friendly
3  1875-03-06   England  Scotland           2           2   Friendly
4  1876-03-04  Scotland   England           3           0   Friendly
5  1876-03-25  Scotland     Wales           4           0   Friendly
6  1877-03-03   England  Scotland           1           3   Friendly
7  1877-03-05     Wales  Scotland           0           2   Friendly

1 个答案:

答案 0 :(得分:0)

我会使用numpy。我们将使用argsort来获取索引,这些索引可用作np.take_along_axis的“花式”索引的输入,以获取团队名称。使用where来对NaN进行平局,然后将结果concat返回到DataFrame。

import pandas as pd
import numpy as np

idx = np.argsort(df[['home_score', 'away_score']].to_numpy(), axis=1)
arr = df[['home_team', 'away_team']].to_numpy()

df1 = (pd.DataFrame(np.take_along_axis(arr, idx, axis=1),
                    columns=['loser', 'winner'],
                    index=df.index)
         .where(df.home_score != df.away_score))

df = pd.concat([df, df1], axis=1)

         date home_team away_team  home_score  away_score tournament     loser    winner
0  1872-11-30  Scotland   England           0           0   Friendly       NaN       NaN
1  1873-03-08   England  Scotland           4           2   Friendly  Scotland   England
2  1874-03-07  Scotland   England           2           1   Friendly   England  Scotland
3  1875-03-06   England  Scotland           2           2   Friendly       NaN       NaN
4  1876-03-04  Scotland   England           3           0   Friendly   England  Scotland
5  1876-03-25  Scotland     Wales           4           0   Friendly     Wales  Scotland
6  1877-03-03   England  Scotland           1           3   Friendly   England  Scotland
7  1877-03-05     Wales  Scotland           0           2   Friendly     Wales  Scotland