根据条件匹配和替换列值

时间:2020-04-30 12:03:53

标签: pandas numpy

我从Series object df1中提取了以下dataframe

df1['K'][25:35]

25     26
26     27
.......
33    UT5
34    XYZ
Name: K, dtype: object

如果字符串值以“ U”开头,我想将“ K”值转换为“ U”。否则,如果它以“ 1”或“ 2”(字符串)开头,我想用“ S”代替。否则,我想保持原样。像这样:

25      S
26      S
.......
33      U
34    XYZ

我尝试了if-else方式,但没有得到结果。我肯定知道分配值的代码不正确。有什么建议吗?

if (df1['K'].str[0].isin(['1','2'])):
    df1['K'].str='S'
elif (df1['K'].str[0].isin(['U'])):)
    df1['K'].str='U'

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

1 个答案:

答案 0 :(得分:4)

在同一列中将numpy.selectdefault参数一起使用(如果不匹配,则返回值),第二个掩码可以使用Series.eq,因为仅比较了一个值:

s = df1['K'].str[0]
m1 = s.isin(['1','2'])
m2 = s.eq('U')

另一个想法是将Series.str.startswith用于遮罩:

m1 = df1['K'].str.startswith(('1','2'))
m2 = df1['K'].str.startswith('U')

df1['K'] = np.select([m1, m2], ['S','U'], default=df1['K'])
print (df1)
      K
25    S
26    S
33    U
34  XYZ