Python Pandas-从元组列表中获取值,并根据条件将它们映射到新列上的值

Python Pandas-从元组列表中获取值,并根据条件将它们映射到新列上的值,python,pandas,Python,Pandas,我有这个数据框,df\u match: # Column Non-Null Count Dtype --- ------ -------------- ----- 0 match_id 680 non-null int64 1 league_id

我有这个数据框,
df\u match

 #   Column                                Non-Null Count  Dtype 
---  ------                                --------------  ----- 
 0   match_id                              680 non-null    int64 
 1   league_id                             680 non-null    object
 2   from_home_player_1_to_home_player_11  680 non-null    object
其中,
from_home_player_1_to_home_player_11
列中的每一行都保存一个元组列表,如下所示:

    X_columns = ["home_player_X1", "home_player_X2", "home_player_X3","home_player_X4", "home_player_X5", 
                 "home_player_X6", "home_player_X7", "home_player_X8", "home_player_X9","home_player_X10", "home_player_X11", 
df\u匹配。示例(1)


目标

现在我想为场上的每个球员设置X/Y坐标(为了简化,这里只使用坐标X),每场比赛(行)

上从家庭玩家玩家玩家玩家1到家庭玩家玩家11的每个玩家都需要一个X值。所以我需要一个新创建的X列列表,如下所示:

    X_columns = ["home_player_X1", "home_player_X2", "home_player_X3","home_player_X4", "home_player_X5", 
                 "home_player_X6", "home_player_X7", "home_player_X8", "home_player_X9","home_player_X10", "home_player_X11", 

最后,每个位置都有一组任意的X值。(当有多个选项时,可以是任意一个,随机选择)


我的目标是绘制-在每一行,玩家的位置到一个X坐标,最后是:

None      match_id league_id  from_away_player_1_to_away_player_11 /
167       243221   26         [(79066, GKP), (82634, MID), (79578, FWD), (34765, DEF), (23476, WING), (32456, MID),(55897, DEF),(45675, MID),(32345, FWD),(45765,FWD),(12354, WING)] /

          home_player_X1 home_player_X2 home_player_X3 home_player_X4
          1              7              10             3
          home_player_X5 home_player_X6 home_player_X7 home_player_X8 
          5              7              4              7
          home_player_X9 home_player_X10 home_player_X11
          10             10              2

如何根据熊猫的位置/值条件进行映射?

我开始考虑通过以下方式迭代数据帧:

for index, value in df_match.iterrows():
    pos = value.from_home_player_1_to_home_player_11[1][1]
    print (index, value)

但我并没有做太多。

类似于您的数据:

df_match = pd.DataFrame( { "match_id" : [243221, 234251], 'league_id' : [26, 11], 
                          'from_home_player_1_to_home_player_11' : [ [(79066, 'GKP'), (82634, 'MID'), (79578, 'FWD'), (34765, 'DEF'), (23476, 'WING'), 
                                                                      (32456, 'MID'), (55897, 'DEF'), (45675, 'MID'), (32345, 'FWD'), (45765,'FWD'),
                                                                      (12354, 'WING')],
                                                                    [(14825, 'GKP'), (82634, 'MID'), (79578, 'FWD'), (34765, 'DEF'), (23476, 'WING'), 
                                                                      (32456, 'MID'), (55897, 'MID'), (45675, 'MID'), (32345, 'DEF'), (45765,'FWD'),
                                                                      (12354, 'WING')],
                                                                   ] }, index=[167, 1999])
建立职位映射,注意所有都是列表:

pmap = {'GKP' : [1], 'DEF': [3,4], 'WING' : [2,5], 'MID' : [6,7,8], 'FWD' : [9,10,11] }
应用字典中的查找,选择随机选项,然后放大到各个列。重命名列:

import random

tmp = df_match['from_home_player_1_to_home_player_11'].apply(lambda x: [ random.choice(pmap.get(pos, -1)) for n, pos in x]).apply(pd.Series)
tmp.columns = [f"home_player_X{i}" for i in range(1,12)]
请注意,如果找不到钥匙,它会将
-1
置于该位置。然后
pd.concat()
将它们放在一起:

df2 = pd.concat([df_match, tmp], axis=1)

谢谢你的回答。什么是
get\u pos\u num()
?这是一个剪切粘贴错误,对此表示抱歉。我修好了。
df2 = pd.concat([df_match, tmp], axis=1)