【问题标题】:Adding column in df with function使用函数在 df 中添加列
【发布时间】:2018-10-07 17:46:42
【问题描述】:
      Date             Visitor  V_PTS                 Home  H_PTS  \
0 2012-10-30 19:00:00  Washington Wizards     84  Cleveland Cavaliers     94   
1 2012-10-30 19:30:00    Dallas Mavericks     99   Los Angeles Lakers     91   
2 2012-10-30 20:00:00      Boston Celtics    107           Miami Heat    120   
3 2012-10-31 19:00:00    Sacramento Kings     87        Chicago Bulls     93   
4 2012-10-31 19:30:00     Houston Rockets    105      Detroit Pistons     96   

尝试添加到抓取的数据集以对 NBA 比赛上座率进行分析。我正在尝试添加一些列,例如竞技场播放量和容量。这是我为添加竞技场而编写的一段函数。有一个更好的方法吗?我有日期时间中的日期,所以我将如何正确提取年份以将正确的竞技场分配给在过去几年中建造新竞技场的球队(萨克拉门托国王队)。还有没有办法为此增加体育场容量并用一块石头杀死两只鸟而不是创建另一个功能?

def label_arena (hometeam):
    if hometeam == 'Toronto Raptors' :
        return 'Air Canada Centre'
    if hometeam == 'Miami Heat' :
        return 'American Airlines Arena'
    if hometeam == 'Dallas Mavericks' :
        return 'American Airlines Center'
    if hometeam == 'Orlando Magic' :
        return 'Amway Center'
    if hometeam == 'San Antonio Spurs' :
        return 'AT&T Center'
    if hometeam == 'Indiana Pacers' :
        return 'Bankers Life Fieldhouse'
    if hometeam == 'Brooklyn Nets' :
        return 'Barclays Center'
    if hometeam == 'Milwaukee Bucks' :
        return 'Bradley Center'
    if hometeam == 'Washington Wizards' :
        return 'Capital One Arena'
    if hometeam == 'Oklahoma City Thunder' :
        return 'Chesapeake Energy Arena'
    if hometeam == 'Memphis Grizzlies' :
        return 'FedExForum'
    if hometeam == 'Sacramento Kings' and df['Date'] < 2016:
        return 'Sleep Train Arena'
    if hometeam == 'Sacramento Kings' and df['Date'] > 2016:
        return 'Golden 1 Center'

【问题讨论】:

  • 使用字典和map 或类似的东西。另外,将数据框作为文本而不是图像发布。
  • 伙计,你似乎真的需要某种数据库,尤其是如果它不断增长(即使它是文本文件、.csv 或类似文件)

标签: python pandas datetime merge


【解决方案1】:

这是你可以做的来简化你的逻辑:

import pandas as pd

df = pd.DataFrame({'Date': ['2012-10-30', '2012-10-30', '2012-10-30',
                            '2012-10-31', '2017-10-31'],
                   'Home': ['Toronto Raptors', 'Los Angeles Lakers', 'Miami Heat',
                            'Sacramento Kings', 'Sacramento Kings']})

df['Date'] = pd.to_datetime(df['Date'])

d = {'Toronto Raptors': 'Air Canada Centre',
     'Los Angeles Lakers': 'Staples Center',
     'Miami Heat': 'American Airlines Arena'}

# general criteria
df['Arena'] = df['Home'].map(d)

# custom criteria
df.loc[(df['Home'] == 'Sacramento Kings') &
       (df['Date'].dt.year < 2016), 'Arena'] = 'Sleep Train Arena'
df.loc[(df['Home'] == 'Sacramento Kings') &
       (df['Date'].dt.year >= 2016), 'Arena'] = 'Golden 1 Center'

print(df)

        Date                Home                    Arena
0 2012-10-30     Toronto Raptors        Air Canada Centre
1 2012-10-30  Los Angeles Lakers           Staples Center
2 2012-10-30          Miami Heat  American Airlines Arena
3 2012-10-31    Sacramento Kings        Sleep Train Arena
4 2017-10-31    Sacramento Kings          Golden 1 Center

【讨论】:

  • 太棒了,这正是我想要的。几个问题。我是否正确假设我可以将竞技场容量添加到字典并用它做类似的事情?
  • @RayGoncalves,是的,你可以这样做。您可以将主队字典用于(竞技场,容量)的元组。
  • @RayGoncalves 我在 5 分钟前的回答中向您发布了这一点。
  • 有没有办法一次映射所有这些? (竞技场、容量、开业年份)arenas = {'Toronto Raptors' : ('Air Canada Centre',19800,1999), 'Miami Heat' :('American Airlines Arena',19600,1999), 'Dallas Mavericks' :('American Airlines Center',19200,2001), 'Orlando Magic' :('Amway Center',18846,2010), 'San Antonio Spurs' :('AT&amp;T Center',18418,2001), 'Indiana Pacers' :('Bankers Life Fieldhouse',17923,1999),
【解决方案2】:
import pandas as pd

home_arenas_capacities = pd.DataFrame([
     ['Toronto Raptors', 'Air Canada Centre', 20511],
     ['Miami Heat', 'American Airlines Arena', 19600],
     ...
    ]) 

df.merge(home_arenas_capacities, on='Home')

对于萨克拉门托国王队,您希望在 'Home' 和 'Date'> 2016 上合并,这可能需要您创建一个临时列,然后 df.merge(..., on=['Home','Date_GE_2016']) 并删除 'Date_GE_2016' 列。

但更简洁的方法是添加一列“季节”=“2015-16”、“2016-17”。随着您的数据库变得更大,您似乎需要它。 (对于游戏数据库,您可以从“Date”值中自动提取“Season”。对于“home_arenas_capacities”数据框,您需要手动编辑它)。

【讨论】:

  • 您建议如何添加“季节”列?很抱歉问了这么多仍然有点新的问题,有时在尝试谷歌搜索并找到这些答案时不知所措。我喜欢这个想法,因为我也正在考虑添加另一列来跟踪当前记录,并且认为我需要跟踪赛季才能准确地做到这一点。
【解决方案3】:

这里有一个使用numpy.select的方法,如果你不反对numpy

import numpy as np

conditions = [
    df['Home'] == 'Toronto Raptors',
    df['Home'] == 'Miami Heat',
    df['Home'] == 'Dallas Mavericks',
    ...
    (df['Home'] == 'Sacramento Kings') & (df['Date'].dt.year < 2016),
    (df['Home'] == 'Sacramento Kings') & (df['Date'].dt.year > 2016)]

choices = [
        'Air Canada Centre',
        'American Airlines Arena',
        'American Airlines Center',
        ...
        'Sleep Train Arena',
        'Golden 1 Center']

df['arena'] = np.select(conditions, choices)

请注意,要使您的df['Date'] 条件起作用,您需要将df['Date'] 设置为日期时间系列(如果您还没有这样做,可以通过df['Date'] = pd.to_datetime(df['Date']) 执行此操作)

【讨论】:

    猜你喜欢
    • 2017-02-24
    • 2021-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-13
    • 2022-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多