繁体   English   中英

遍历行熊猫数据框并添加值

[英]Iterate over rows pandas dataframe and add values

我有以下数据帧摘录,代表篮球比赛的一场比赛:

    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

我想确定每个团队的时间。 在tno列中,您基本上可以看到哪个团队拥有所有权,所以我的目的是从最后一行开始对熊猫进行迭代,并将其标记为Posession,然后转到下一个并标记tno拥有的所有行。 a 2表示为Posession 2,之后,当tno更改为1时,将其标记为Posession 3,然后重复该操作,直到我计算并标记所有不同的Posession; 所以最后我可以获取每个季度,每个团队的每个驻足时间的平均值,以查看哪个团队拥有更快的驻足时间,等等。

我已经尝试过for循环,并且可以通过这种方式做到这一点,但是我正在尝试学习熊猫,并且在每一部分中,我都看到应该避免循环,我已经成功地使用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行,此问题并不重要),因此我可以获得每个存储位置的最后一个,其结束方式等。

这是分解步骤的另一种尝试。

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

输出量

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM