Pandas 使用 map 或 apply 从使用字典的调整中创建一个新列

乔恩

我有来自体育赛事的数据,而且我知道每个主场都存在偏见,我想对其进行调整。我已经创建了一个字典,其中 arena 是键,值是我想要进行的调整。

所以对于每一行,我想拿主队,得到调整,然后从距离列中减去。我有以下代码,但似乎无法正常工作。

#Making the dictionary, this is working properly
teams = df.home_team.unique().tolist()
adj_shot_dict = {}
for team in teams:
    df_temp = df[df.home_team == team]
    average = round(df_temp.event_distance.mean(),2)
    adj_shot_dict[team] = average

def make_adjustment(df):
    team = df.home_team
    distance = df.event_distance
    adj_dist = distance - adj_shot_dict[team]
    return adj_dist

df['adj_dist'] = df['event_distance'].apply(make_adjustment)
科拉连

IIUC,你已经有了字典,你想简单的减法adj_shot_dict,以event_distance柱:

df['adj_dist'] = df['event_distance'] - df['home_team'].map(adj_shot_dict)

旧答案

分组home_team,计算平均值,event_distance然后减去结果为event_distance

df['adj_dist'] = df['event_distance'] \
                 - df.groupby('home_team')['event_distance'] \
                     .transform('mean').round(2)

# OR

df['adj_dist'] = df.groupby('home_team')['event_distance'] \
                   .apply(lambda x: x - x.mean().round(2))

表现

>>> len(df)
60000

>>> df.sample(5)
  home_team  event_distance
5     team3              60
4     team2              50
1     team2              20
1     team2              20
0     team1              10
def loop():
    teams = df.home_team.unique().tolist()
    adj_shot_dict = {}
    for team in teams:
        df_temp = df[df.home_team == team]
        average = round(df_temp.event_distance.mean(),2)
        adj_shot_dict[team] = average

def loop2():
    df.groupby('home_team')['event_distance'].transform('mean').round(2)
>>> %timeit loop()
13.5 ms ± 194 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

>>> %timeit loop2()
3.62 ms ± 167 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

# Total process
>>> %timeit df['event_distance'] - df.groupby('home_team')['event_distance'].transform('mean').round(2)
3.7 ms ± 21.5 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用 DataFrame.apply 使用 Pandas 中的特定列创建一个新列

使用apply函数在pandas中创建一个具有舍入值的新列

使用 for 循环在 Pandas 中创建一个新列?

使用Pandas df.apply创建新列

使用apply()而不是for循环-Pandas

使用 map() 时出错:根据另一列中的值创建新的 Pandas 列

multiprocessing.Pool:何时使用apply,apply_async或map?

Python Pandas-使用Apply功能并在DataFrame中创建新列

如何使用 apply 在 pandas 中创建新列来解决错误?

pandas中map函数的使用

如何使用apply、map或applymap在pandas數據框中查找每一行和列數據類型?

使用 apply 使用每行的非空值创建一个新列

Pandas中map,applymap和apply方法之间的区别

使用column及其值在pandas数据框中创建一个新列

使用 *args 编写函数在 Pandas 数据框中创建一个新列

Python Pandas:使用apply()从数组中减去一个值

Python Pandas:使用Aggregate vs Apply定义新列

使用pandas .map更改值

使Pandas DataFrame apply()使用所有内核?

在多级DataFrame上使用Pandas Apply功能

Python Pandas:在Apply中使用行号

Pandas 在多列上使用 apply 函数扩展

在 Pandas 中使用 lambda 和 .apply()

如何使用pandas apply来替换iterrows?

如何使用pandas apply函数创建多列

使用.apply()带有字符串的Pandas创建列

Pandas DataFrame.apply:使用来自两列的数据创建新列

使用groupby和apply时为多索引中的一个索引创建新级别

在Pandas中使用apply函数以每行使用一个Regex计数