python - 迭代 pandas dataframe 的行并添加值

标签 python pandas dataframe

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

    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 列中,您基本上可以看到哪个团队拥有所有权,所以我的目的是迭代 pandas,从最后一行开始,并将其标记为所有权一,然后转到下一行并标记 tno 拥有的所有行a 2作为posssion 2,之后,当tno变为1时,将其标记为posssion 3,并重复该 Action ,直到我统计并标记所有不同的posssion;所以最后我可以获得每季度、每队每次控球的平均值,看看哪支球队的控球速度更快等等。

我已经尝试过使用 for 循环,我可以用这种方式做到这一点,但我正在尝试学习 pandas,在每个部分我都认为应该避免循环,我已经使用轮类成功完成了相同的部分,但我不知道如何使用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

输出

enter image description here

关于python - 迭代 pandas dataframe 的行并添加值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57931169/

相关文章:

Python如何获取一张图像中使用的颜色列表

python - pandas-两列的值是列表,需要生成一个新的 df 来显示它们之间的所有值组合

python - Dask DataFrame.to_parquet 读取 - 重新分区 - 写入操作失败

python - Pandas - 用非空值的聚合替换 NaN

r - 是否可以使用比使用因子时更小的数据集?

python - SQLAlchemy 自动提交?

python - Pandas 系列过滤

python - 使用 python 访问 PostgreSQL 数据库的安全方法

python - 如何将嵌套字典列表转换为 pandas DataFrame?

python - Pandas .min() 方法似乎不是最快的