【问题标题】:Creating a loop for a new column of values out of existing values [duplicate]从现有值中为新的值列创建循环[重复]
【发布时间】:2023-03-16 00:42:01
【问题描述】:

我希望在数据框中创建一个新列,以指示比赛是以主场胜利、客场胜利还是平局结束。

这是我目前使用的代码:

for value in df2:
    if value in df2['home_goals'] > df2['away_goals']:
        df2['result'] = 'H'
    elif value in df2['home_goals'] < df2['away_goals']:
        df2['result'] = 'A'
    else:
        df2['result'] = 'D'

这是输出。

              Home Team       Away Team home_goals away_goals result
Season                                                              
2018-2019       Man Utd       Leicester          2          1      D
2018-2019     Newcastle           Spurs          1          2      D
2018-2019   Bournemouth         Cardiff          2          0      D
2018-2019        Fulham  Crystal Palace          0          2      D
2018-2019  Huddersfield         Chelsea          0          3      D

正如您所看到的那样,在这种情况下,主队或客队获胜,而是将所有结果显示为平局。

谁能告诉我我哪里出错了?

谢谢

【问题讨论】:

  • 你能提供一些数据吗? dataframe.head(10) 之类的东西很好分析
  • 感谢已经尝试了其中的一些并解决了这个问题。非常感谢您的帮助!

标签: python python-3.x pandas dataframe for-loop


【解决方案1】:

一种pythonic的方式可能是,

import numpy as np

df2['result'] = np.where(df2['home_goals'] > df2['away_goals'], 'H', 
                         np.where(df2['home_goals'] < df2['away_goals'], 'A', 'D'))

使用链式np.where() 命令。

【讨论】:

    【解决方案2】:

    您可以在此处使用np.select

    condlist = [
        df2["home_goals"] > df2["away_goals"],
        df2["home_goals"] < df2["away_goals"],
    ]
    choicelist = ["H", "A"]
    df2["result"] = np.select(condlist, choicelist, "D")
    

    np.select 可以有任意数量的条件

    condlist = [cond1, ..., condn]
    choicelist = [choice1, ..., choicen]
    # Here mapping is as follows:
    # cond1 &LongRightArrow; choice1
    # ...
    # condn &LongRightArrow; choicen
    np.select(condlist, choicelist, default='your_default_value')

    【讨论】:

      【解决方案3】:

      与您的方法类似的是在数据帧上使用逐行应用函数

      df = pd.DataFrame({'home':[2,1,0,2],'away':[1,3,1,2]})
      
      def fun(x):
          if x['home']>x['away']:   return 'H'
          elif x['home']<x['away']: return 'A'
          else : return 'D'
      
      df['result'] = df.apply(fun,axis=1)
      

      【讨论】:

        【解决方案4】:

        您也可以使用apply()iterrows() 进行循环,在您的代码中values in 可能是原因,因此请删除它。

        def filter(row):
          result =''
          # Removed values in
          if row['home_goals'] > row['away_goals']:
            result = 'H'
          elif row['home_goals'] < row['away_goals']:
            result = 'A'
          else:
            result = 'D'
          return result
        
        df['result'] = df.apply(filter,axis=1)
        

        【讨论】:

          猜你喜欢
          • 2020-11-28
          • 1970-01-01
          • 2018-07-25
          • 2019-09-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-12-27
          • 1970-01-01
          相关资源
          最近更新 更多