我有一个如下数据框:
s1 AA AG AG GG AA
s2 DI DD GG GG GG
S3 TT CC TC TT TC
S3 AA DI AA AA AA
S3 CC CC DD CC CC
,如果行中有DI或DD,我想将行中的所有其他字符串替换为II。 所以最终的数据框应该是这样的。
s1 AA AG AG GG AA
s2 DI DD II II II
S3 TT CC TC TT TC
S3 II DI II II II
S4 II II DD II II
任何建议都值得赞赏。预先谢谢你
答案 0 :(得分:2)
用DataFrame.isin
检查两个值,然后用DataFrame.where
仅替换至少具有一个True
的行:
m = df.isin(['DI','DD'])
m1 = m.any(1)
df[m1] = df[m1].where(m, 'II')
或将numpy广播用于两个掩码的链接:
m = df.isin(['DI','DD'])
df = df.where(m.values | ~m.any(1).values[:, None], 'II')
print (df)
0 1 2 3 4 5
0 s1 AA AG AG GG AA
1 II DI DD II II II
2 S3 TT CC TC TT TC
3 II II DI II II II
4 II II II DD II II
编辑:
通过-
的链式掩码,可以对|
进行按位OR:
print (df)
0 1 2 3 4 5
0 s1 AA AG AG GG -
1 s2 DI DD GG GG -
2 S3 TT CC TC TT TC
3 S3 AA DI AA AA AA
4 S3 CC CC DD CC CC
m = df.isin(['DI','DD'])
m1 = m.any(1)
df[m1] = df[m1].where(m | df.eq('-'), 'II')
print (df)
0 1 2 3 4 5
0 s1 AA AG AG GG -
1 II DI DD II II -
2 S3 TT CC TC TT TC
3 II II DI II II II
4 II II II DD II II
答案 1 :(得分:1)
m = df.isin(['DI','DD']).sum(axis=1).astype(bool)
df.loc[m,:] = df.loc[m,:].applymap(lambda x: x if x in ["DI","DD"] else "II")
print(df)