我有以下数据帧摘录,表示一场篮球比赛的逐场比赛:
import pandas as pd
data = {'actionNumber':
[669,668,667,666,665,663,662,661,660,659,657,656,655], 'gt':['03:12','03:12','03:18','03:18','03:36','03:48','03:48','03:48','03:48','03:51','03:51','03:55','03:58'], 'actionType':['steal','turnover','assist','3pt','2pt','freethrow','freethrow','foulon','foul','steal','turnover','rebound','2pt'], 'player':['S. WOHLWEND','F. DELLA MEA','Z. RIAUKA','A. VIOTTI','J. VIANA','A. VIOTTI','A. VIOTTI','A. VIOTTI','E. GONZALEZ','A. VIOTTI','A. ARISTIMUNO','P. BLACKWELL','A. VIOTTI'], 'tno':['1', '2','1','1','2','1','1','1','2','1','2','2','1']}
df = pd.DataFrame(data)
df我想要确定每个团队拥有一个posession的时间。在tno列中,基本上可以看到哪个团队拥有posession,所以我的目的是迭代pandas,从最后一行开始,将其标记为posession 1,然后转到下一行,将tno为2的所有行标记为posession 2,之后,当tno变为1时,将其标记为posession 3,并重复此操作,直到我计算并标记所有不同的posession;因此,最后我可以获得每个季度、每个团队的每个posession的平均值,看看哪个团队拥有更快的posession,等等。
我已经尝试过for循环,我可以用这种方式来做,但我正在尝试学习pandas,在我看到的每个部分都应该避免循环,我已经成功地使用shift完成了相同的部分,但我不知道如何使用shift,因为我不知道它将持续多少次。
我期待以下几点:
data = {'actionNumber':
[669,668,667,666,665,663,662,661,660,659,657,656,655], 'gt':['03:12','03:12','03:18','03:18','03:36','03:48','03:48','03:48','03:48','03:51','03:51','03:55','03:58'], 'actionType':['steal','turnover','assist','3pt','2pt','freethrow','freethrow','foulon','foul','steal','turnover','rebound','2pt'], 'player':['S. WOHLWEND','F. DELLA MEA','Z. RIAUKA','A. VIOTTI','J. VIANA','A. VIOTTI','A. VIOTTI','A. VIOTTI','E. GONZALEZ','A. VIOTTI','A. ARISTIMUNO','P. BLACKWELL','A. VIOTTI'], 'tno':['1','2','1','1','2','1','1','1','2','1','2','2','1'],'pn': ['7','6','5','5','4','3','3','3','','3','2','2','1']}
df = pd.DataFrame(data)
df其中pn是偏置编号(忽略第57b行,它对这个问题不重要),这样我就可以获得每个偏置的最后一个,它是如何结束的,等等。
发布于 2019-09-14 07:44:36
这里是另一种尝试来分解这些步骤。
df = df.sort_values('actionNumber', ascending=True)
tno = df.tno.to_list()
# check if fouls happened
isfoul = (df.actionType=='foul').astype(int).to_list()
tnox = [int(x)-int(y) for x,y in zip(tno,isfoul)]
# calculate when a swap happens
swap_counter = [1] + [np.abs(int(x) - int(y)) for x, y in zip(tnox[:-1], tnox[1:])]
# evaluate a cumulative sum of all swaps
df['pn'] = np.array(swap_counter).cumsum()*np.abs(1-np.array(isfoul))
# adjust column pn: (where rows with actionType='foul') leave cell value empty
df.pn.loc[df.actionType=='foul'] = ''
df = df.sort_values('actionNumber', ascending=False)
df输出

https://stackoverflow.com/questions/57931169
复制相似问题