如果其中一列具有特定的字符串,请替换一行的字符串

时间:2019-10-31 12:07:40

标签: pandas

我有一个如下数据框:

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

任何建议都值得赞赏。预先谢谢你

2 个答案:

答案 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)