如果其他矩阵值等于熊猫中的某个值,则用 NaN 替换值

Posted

技术标签:

【中文标题】如果其他矩阵值等于熊猫中的某个值,则用 NaN 替换值【英文标题】:Replace values by NaN's if other matrix values equals a certain value in pandas 【发布时间】: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 在这些比赛中处于发球状态。

一切都会有帮助!

【问题讨论】:

【参考方案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  

【讨论】:

以上是关于如果其他矩阵值等于熊猫中的某个值,则用 NaN 替换值的主要内容,如果未能解决你的问题,请参考以下文章

熊猫不识别 np.nan 值吗? [复制]

如何在熊猫中的 NaN 值之间平均重新分配值?

做某事。如果在熊猫数据框中列中的值等于 1

无法使用系列设置熊猫列值,而是将所有内容都设置为np.nan

从前一行和特定列值有效地更新熊猫数据框中的 NaN

如何在熊猫中用 NaN 替换浮点值?