【问题标题】:Replace values by NaN's if other matrix values equals a certain value in pandas如果其他矩阵值等于熊猫中的某个值,则用 NaN 替换值
【发布时间】:2020-11-20 15:32:15
【问题描述】:

我有两个 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 在这些比赛中处于发球状态。

一切都会有帮助!

【问题讨论】:

    标签: python pandas replace nan missing-data


    【解决方案1】:

    你可以试试reindexreplacewhere

    选项 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和这个掩码(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  
    

    【讨论】:

      猜你喜欢
      • 2018-08-24
      • 2021-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-26
      • 2021-03-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多