首页 > 解决方案 > 如果其他矩阵值等于熊猫中的某个值,则用 NaN 替换值

问题描述

我有两个 multiIndex 数据框;1 指示哪个玩家在服务器上,另一个跟踪点数。因此,每场比赛由发球者轮换。

col0 = ['Game 1','Game 1','Game 2','Game 2','Game 3','Game 3','Game 4','Game 4','Game 5','Game 5']
col1 = ['P1','P2','P1','P2','P1','P2','P1','P2','P1','P2']
a = pd.DataFrame(data = np.random.rand(3,10))
a.columns = [col0,col1]

     Game 1              Game 2  ...    Game 4    Game 5          
         P1        P2        P1  ...        P2        P1        P2
0  0.375562  0.408865  0.107393  ...  0.552553  0.986619  0.635726
1  0.101053  0.949870  0.804260  ...  0.895951  0.384401  0.368055
2  0.879938  0.740631  0.369314  ...  0.624967  0.061308  0.625157

和数据框'b'指示哪个球员正在发球。

col0 = ['Game 1','Game 2','Game 3','Game 4','Game 5']
col1 = ['Server','Server','Server','Server','Server']
b = pd.DataFrame([[1,2,1,2,1],
                  [2,1,2,1,2], 
                  [1,2,1,2,1]])
b.columns = [col0, col1] 

  Game 1 Game 2 Game 3 Game 4 Game 5
  Server Server Server Server Server
0      1      2      1      2      1
1      2      1      2      1      2
2      1      2      1      2      1 

现在我想创建数据框 c,它看起来像:

     Game 1              Game 2  ...    Game 4    Game 5          
         P1        P2        P1  ...        P2        P1        P2
0  0.375562  0.408865  np.nan    ...  np.nan    0.986619  0.635726
1  np.nan    np.nan    0.804260  ...  0.895951  np.nan    np.nan
2  0.879938  0.740631  np.nan    ...  np.nan    0.061308  0.625157

每当玩家 2 上场时,我希望将数据框“a”的值替换为 NaN。例如,在数据帧“c”的第一行中,仅显示了第 1 场、第 3 场和第 5 场比赛中的分数,因为球员 1 在这些比赛中处于发球状态。

任何事情都会有帮助!

标签: pythonpandasreplacenanmissing-data

解决方案


您可以尝试使用reindex,replacewhere

选项1

temp=b.reindex(columns=map(lambda x:(x[0],'Server') ,a.columns)).replace({1:True,2:False})
a.where(temp.values)

与此相同np.where

选项 2

import numpy as np
temp=b.reindex(columns=map(lambda x:(x[0],'Server') ,a.columns))
pd.DataFrame(np.where(temp.eq(1), a, np.nan),columns=a.columns)

与修改原始 b 相同,并使用以下方式应用掩码where

选项 3

msk=[x.repeat(2)==1 for x in b.values]
a.where(msk)


选项 1 的详细信息:

首先你映射这样的列a

list(map(lambda x:(x[0],'Server') ,a.columns))
[('Game 1', 'Server'), ('Game 1', 'Server'), ('Game 2', 'Server'), ('Game 2', 'Server'), ('Game 3', 'Server'), ('Game 3', 'Server'), ('Game 4', 'Server'), ('Game 4', 'Server'), ('Game 5', 'Server'), ('Game 5', 'Server')] 

然后您使用reindex该映射列表:

b.reindex(columns=map(lambda x:(x[0],'Server') ,a.columns))
  Game 1        Game 2        Game 3        Game 4        Game 5       
  Server Server Server Server Server Server Server Server Server Server
0      1      1      2      2      1      1      2      2      1      1
1      2      2      1      1      2      2      1      1      2      2
2      1      1      2      2      1      1      2      2      1      1 

之后,您可以使用replace以下方式获取更改值temp

b.reindex(columns=map(lambda x:(x[0],'Server') ,a.columns)).replace({1:True,2:False})
  Game 1        Game 2        Game 3        Game 4        Game 5       
  Server Server Server Server Server Server Server Server Server Server
0   True   True  False  False   True   True  False  False   True   True
1  False  False   True   True  False  False   True   True  False  False
2   True   True  False  False   True   True  False  False   True   True 

where最后,您使用此 mask( )映射temp的值a

a.where(temp.values)
     Game 1             Game 2              Game 3              Game 4  \
         P1       P2        P1        P2        P1        P2        P1   
0  0.973453  0.02111       NaN       NaN  0.435252  0.335656       NaN   
1       NaN      NaN  0.195463  0.960642       NaN       NaN  0.527152   
2  0.280339  0.97697       NaN       NaN  0.833331  0.476428       NaN   

               Game 5            
         P2        P1        P2  
0       NaN  0.676733  0.600626  
1  0.924126       NaN       NaN  
2       NaN  0.675638  0.319161  

推荐阅读