python - 我有两个 pyspark 数据框,并想根据第一个数据框中的列值计算第二个数据框中的点数和
问题描述
所以这是我的第一个包含玩家积分的数据框
选手姓名 | PID | 匹配ID | 积分 | |
---|---|---|---|---|
0 | 维拉特·科利 | 10 | 2 | 0 |
1 | 拉维钱德兰·阿什温 | 11 | 2 | 9 |
2 | 高塔姆·甘比尔 | 12 | 2 | 1 |
3 | 拉文德拉·贾德加 | 13 | 2 | 7 |
4 | 阿米特·米什拉 | 14 | 2 | 2 |
5 | 穆罕默德·沙米 | 15 | 2 | 2 |
6 | 卡伦奈尔 | 16 | 2 | 4 |
7 | 哈迪克·潘迪亚 | 17 | 2 | 0 |
8 | 切特什瓦尔·普哈拉 | 18 | 2 | 9 |
9 | Ajinkya Rahane | 19 | 2 | 5 |
这是我的第二个数据框,我希望根据我所在行中的玩家计算总和
我想要的输出是这个
所以我有一个解决方案,但我想要一种有效的方法在 pyspark
## Function, will return corrosponsing point for Player from df1
def replacepoints(x):
return df1['points'].where(df1['Playername']==x).sum()
## Iterating through All Names and replacing with their points so that we can sum whole single row to get total points
df3 = df2[['p1','p2','p3','p4','p5','p6','p7','p8','p9','p10','p11']].copy()
# df3
length = len(df3)
for i in range(length):
j_len = len(df3.iloc[i])
for j in range(j_len):
name = df3.iloc[i][j]
df3.iloc[i][j] = replacepoints(name)
# print(name)
# print(replacepoints(name))
## now df3 contains points only
# df3
## storing the sum in points
points = df3.sum(axis=1)
points
# Add points to df2 ponts
df2['points'] = points
解决方案
代码
import pandas as pd
df1 = pd.read_csv('player_points.csv')
df2 = pd.read_csv('small_input_spark.csv')
player_name = list(df1['Playername'])
points = list(df1['points'])
j = 0
for i in player_name:
df2.iloc[:,7:] = df2.iloc[:,7:].replace([i], int(points[j]))
j += 1
df2['points'] = df2.iloc[:,7:].sum(axis=1)
df2.head()
这样你可以避免嵌套循环,我们也可以创建副本,这样它就不会改变原始数据集
注意:它使用相同的方法将玩家名称替换为点数,然后进行逐行求和