Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用特定行和列计算滚动和_Python_Pandas - Fatal编程技术网

Python 使用特定行和列计算滚动和

Python 使用特定行和列计算滚动和,python,pandas,Python,Pandas,我有一个相当具体的问题 我试图分析一些历史足球数据,并想创建一个列,每个球队最近的主客场进球数,例如。我试图简化这里的内容,假设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

我有一个相当具体的问题

我试图分析一些历史足球数据,并想创建一个列,每个球队最近的主客场进球数,例如。我试图简化这里的内容,假设
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
  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
我想做的是对df中每一行的主场和客场的最近两个目标数(
HG
和/或
AG
)求和。但我显然不想考虑最近的争吵

所以,如果我们看索引行0。家是“A”。我希望得到的数字是6,在AG下的索引行2中有5个是客队,在索引行4中有1个是主队,总共相等于6。对于索引行0中的客场B队,我希望结果是索引行1和索引行3中的4。等等如果要计算的数据点少于2个,我还想返回
np.NaN

我最初想写一个小函数来帮助实现这一点,类似的东西,但显然这是非常不正确的:

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']]
我希望得到的是这样的东西:

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
  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

非常感谢

首先,让我们向数据帧添加一列,以便行索引可用。然后创建一个堆叠的dataframe,以便Home和Away列成为单个列,HG和AG列成为单个列,同时保持索引的完整性。基本上,原始df的Home和Away值将成为两个连续的行。然后从堆叠的数据框中选取引用索引大于原始索引的最近两行,并添加目标。(必须手动设置最后两行)


首先,让我们向数据帧添加一列,以便行索引可用。然后创建一个堆叠的dataframe,以便Home和Away列成为单个列,HG和AG列成为单个列,同时保持索引的完整性。基本上,原始df的Home和Away值将成为两个连续的行。然后从堆叠的数据框中选取引用索引大于原始索引的最近两行,并添加目标。(必须手动设置最后两行)


谢谢你的帮助,似乎已经做了这个把戏。谢谢你的帮助,似乎已经做了这个把戏