迭代并覆盖pandas datafram中的特定值

2024-04-19 18:19:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个大数据框整理了一堆篮球数据(截图如下)。Opp-Lineup右边的每一列都是一个虚拟变量,指示该玩家(列名称中指明)是否在当前的阵容中(列名的最后一部分是team name,需要与opponent列进行比较,以确保不同球队中编号和名称相同的两名球员不会弄乱)。我知道遍历pandas数据帧的几种方法(iterrows、itertuples、iteritems),但我不知道如何完成我需要的任务,即每列中的每一行:

  1. 比较团队(columnname.split()[2:])到对手列(LSU玩家除外)
  2. 看看名字(columnname.split()[:2])在对手阵容中,或者,对于LSU玩家,是在阵容中
  3. 如果满足上述条件,则将该值替换为1,否则保留为0

enter image description here

循环遍历数据帧并完成此任务的最佳方法是什么?在这种情况下,速度并不重要。我理解其中的所有逻辑,只是我对熊猫不够熟悉,不知道如何循环使用它,而且尝试在Google上看到的各种东西都是行不通的。在


Tags: 数据方法name名称玩家整理teamsplit
2条回答

考虑一个整形/透视解决方案,因为您的数据是宽格式的,但您需要按行比较长格式的值。所以,首先melt您的数据,这样所有的列标题都将成为一个实际的列'Player',并将其对应的值'IsInLineup'。运行伪值的条件比较,然后在列标题中使用播放器返回原始结构。当然,我没有实际的数据来全面测试这个例子。在

# MELT 
reshapedf = pd.melt(df, id_vars=['Opponent', 'Lineup', 'Minutes', 'Plus Minus', 
                                 'Plus Minus Per Minute', 'Opp Lineup'], 
                    var_name='Player', value_name='IsInLineup')

# APPLY FUNCTION (SPLITTING VALUE AND THEN JOINING FOR SUBSET STRING)
reshapedf['IsInLineup'] = reshapedf.apply(lambda row: (' '.join(row['Player'].split(' ')[:2]) in row['Opp Lineup'] and
                                                       ' '.join(row['Player'].split(' ')[2:]) in row['Opponent'])*1, axis=1)

# PIVOT (UNMELT)
df2 = reshapedf.pivot_table(index=['Opponent', 'Lineup', 'Minutes', 'Plus Minus', 
                                   'Plus Minus Per Minute', 'Opp Lineup'], columns='Player').reset_index()
df2.columns = df2.columns.droplevel(0).rename(None)
df2.columns = df.columns

如果上面的lambda函数看起来有点复杂,请尝试等效的apply defined function():

^{pr2}$

最后我用了一个变通办法。我反复使用数据框错误对于每个迭代,为每个迭代创建一个列表,其中检查我想要的值,然后将0或1附加到临时列表中。然后我简单地把它插入到数据帧中。可能不是最有效的记忆方式,但它起作用了。在

相关问题 更多 >