python - 如果其他矩阵值等于熊猫中的某个值,则用 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 在这些比赛中处于发球状态。
任何事情都会有帮助!
解决方案
您可以尝试使用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
最后,您使用此 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