如果其他矩阵值等于熊猫中的某个值,则用 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】:你可以试试reindex
、replace
和where
:
选项 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 替换值的主要内容,如果未能解决你的问题,请参考以下文章