首页 > 解决方案 > 根据条件,匹配和替换列值

问题描述

我从df1Series object中提取了以下内容。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().

标签: pandasnumpy

解决方案


numpy.select与具有相同列的参数一起使用default(如果不匹配则返回值),可以使用第二个掩码,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

推荐阅读