首页 > 解决方案 > 我有两个 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

标签: pythonapache-sparkpyspark

解决方案


代码

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()

这样你可以避免嵌套循环,我们也可以创建副本,这样它就不会改变原始数据集

注意:它使用相同的方法将玩家名称替换为点数,然后进行逐行求和


推荐阅读