我有一个非常具体的问题。
例如,我正在尝试分析一些历史足球数据,并希望为每支球队创建几列最近的主场和客场进球数。我试图在这里简化事情,让我们说df看起来像这样:
df = pd.DataFrame({'Home':['A','B','C','B','A','A','C'],'Away':['B','C','A','C','B','B','A'],
'HG':[1,2,3,2,1,4,1],'AG':[2,4,5,1,3,2,2]})
Home Away HG AG
0 A B 1 2
1 B C 2 4
2 C A 3 5
3 B C 2 1
4 A B 1 3
5 A B 4 2
6 C A 1 2
我想要做的是将 df 中每一行的 Home 和 Away 的最近两个目标数字(HG和/或)相加。AG但我显然不想考虑最近的一行。
因此,如果我们查看索引第 0 行。首页是“A”。我希望得到的数字是 6,来自 AG 下的索引第 2 行的 5 作为 A 是这一行的客队,而索引第 4 行的 1 作为 A 是主队,总共等于 6。对于索引行 0 中的客队 B,我希望结果为 4,从索引行 1 和索引行 3 开始。依此类推。np.NaN如果要计算的数据点少于 2 个,我也想返回。
我最初想可能写一个小函数来帮助做到这一点,类似于this但显然这是非常不正确的:
def get_rolling_sum(x):
count_list = []
new_df = df[(df['Home'] == str(x)) | (df['Away'] == str(x))]
for i in range(0,len(new_df)):
if new_df['Home'].iloc[i] == str(x):
count_list.append(new_df['HG'].iloc[i])
elif new_df['Away'].iloc[i] == str(x):
count_list.append(new_df['AG'].iloc[i])
df['Roll_Home'] = [get_rolling_sum(x) for x in df['Home']]
我希望得到的是这样的:
Home Away HG AG Expected_Home
0 A B 1 2 6.0
1 B C 2 4 5.0
2 C A 3 5 2.0
3 B C 2 1 5.0
4 A B 1 3 6.0
5 A B 4 2 NaN
6 C A 1 2 NaN
非常感谢