python - Pandas 比较棒球比赛的连续得分

标签 python pandas

df = pd.DataFrame({'Date': [402, 402, 402, 402, 403, 403, 404, 404],
                   'Team' : ['SFO', 'ARI', 'CUB', 'STL', 'NYY', 'SEA', 'OAK', 'LAA'],
                   'Final' :[4, 6, 2, 5, 7, 2, 1, 2]})

df_expected =  pd.DataFrame({'Date': [402, 402, 402, 402, 403, 403, 404, 404],
                       'Team' : ['SFO', 'ARI', 'CUB', 'STL', 'NYY', 'SEA', 'OAK', 'LAA'],
                       'Final' :[4, 6, 2, 5, 7, 2, 1, 2], 
                       'Win_Loss': [0,1,0,1,1,0,0,1],
                       'Run_diff': [-2,2,-3,3,5,-5,-1,1]})

我正在尝试创建两列:用于运行差异的 Run_diff 和一个二进制赢/输列。

到目前为止我能做的最好的事情:

设置奇偶列来尝试对游戏进行分组进行分析

df['Test'] = 1
for i, j in enumerate(df['Final']):
    if (i % 2) == 0: 
        df['Test'][i] = 'Even'
    else: 
        df['Test'][i] = 'Odd'
  

尝试连续获得分数以便更容易加/减

df['Shift'] = df['Final'].shift(fill_value = 0)

尝试使用上面创建的两个列

conditions = [(df['Test'] == 'Odd'),
             (df['Test'] == 'Even')]

values = [df['Final'] - df['Shift'], 0]

df['Run_diff'] = np.select(conditions, values)

这对于任何奇数列都适用,这是我尝试将行分组为游戏的尝试。但我不知道如何让偶数列工作。

您不必使用我的代码,因为它不是最优雅的。我确信这一点。我非常愿意为此尝试和应用新的/更好的技术。

谢谢。

最佳答案

您可以按奇数行和偶数行重新索引。

计算单行中两队的 run_diff 和 win_loss。

然后通过堆叠和重新索引将数据返回到其初始顺序。

import pandas as pd

df = pd.DataFrame({'Date': [402, 402, 402, 402, 403, 403, 404, 404],
                   'Team': ['SFO', 'ARI', 'CUB', 'STL', 'NYY', 'SEA', 'OAK', 'LAA'],
                   'Final': [4, 6, 2, 5, 7, 2, 1, 2]})

# Re Index Based on Odd And Even Rows
new_df = df.set_index([df.index // 2, df.index % 2]).unstack()

# Calculate Run Diff in Both Directions
new_df['Run_Diff', 0] = new_df['Final', 0] - new_df['Final', 1]
new_df['Run_Diff', 1] = new_df['Final', 1] - new_df['Final', 0]
# Calculate Win Loss in Both Directions
new_df['Win_Loss', 0] = (new_df['Run_Diff', 0] > 0).astype(int)
new_df['Win_Loss', 1] = (new_df['Run_Diff', 1] > 0).astype(int)

# Remove Multi Index, Change Column Order
new_df = (
    new_df.stack(1)
        .reset_index(drop=True)[['Date', 'Team', 'Final', 'Win_Loss', 'Run_Diff']]
)
print(new_df)

输出:

   Date Team  Final  Win_Loss  Run_Diff
0   402  SFO      4         0        -2
1   402  ARI      6         1         2
2   402  CUB      2         0        -3
3   402  STL      5         1         3
4   403  NYY      7         1         5
5   403  SEA      2         0        -5
6   404  OAK      1         0        -1
7   404  LAA      2         1         1

关于python - Pandas 比较棒球比赛的连续得分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67236891/

相关文章:

python selenium css 选择器第 n 个元素

python - 使用 seaborn 绘图时如何处理缺失值?

python - 如何合并 Pandas 中的列?

python - 连接 Pandas 系列并将系列名称添加到多级索引

python - Minizinc Python - 使用 .dzn 模块而不是实例模块

Python:Sqlalchemy 搞砸了 pyinstaller?

excel - 我可以在 python3 中从 excel 文件(不是 CSV)创建字典吗?

python - pandas 中的连接表

pandas - 每个示例使用多个类别对分类特征进行编码 - sklearn

python - 使用 pd.to_datetime 处理多种日期时间格式