如何将DataFrame列中的数值替换为基于原始数字Pandas值的字符串



我有一个带有数值的DataFrame列,例如

df=pd.DataFrame({'my_col':[1,0,1,0,4,5,8,10,12]})

my_col列中,我想根据一组条件替换所有值:

  • 如果小于或等于1,则为"1或更小">
  • 如果大于1,则为"2到10"且小于10
  • 如果大于10,则为"大于10">

我试过:

df.loc[(type(df['my_col']) != str) & (df['my_col'] < 2), 'my_col'] = '1 or less'
df.loc[(type(df['my_col']) != str) & (df['my_col'] > 1) & (df['my_col'] <= 10),'my_col'] = '2 to 10'
df.loc[(type(df['my_col']) != str) & (df['my_col'] > 10), 'my_col'] = 'more than 10'

我得到以下错误:类型错误:">"在"str"one_answers"int"的实例之间不支持

第一行似乎执行得很好,但之后的列包含数字和str值的混合

因此,我试图绕过这一点,在开始第二行代码之前,先过滤掉str值,使用:

df.loc[type(df['my_col']) != str]

但这给出了一个错误:'没有布尔索引就不能使用布尔标签'

所以我甚至尝试过这种东西:

df[df['my_col'].apply(lambda x: not isinstance(x, str))].loc[(df['my_col'] > 1) & (df['my_col'] <= 10),'my_col'] = '2 to 10'

但是,如果我返回df,则不会分配值。

有什么建议吗?

使用pd.cut

pd.cut(df['my_col'], bins=[float('-inf'), 1, 10, float('inf')], labels=['1 or less', '2 to 10', 'more than 10'])

这假设您只处理整数,例如没有标记为'2 to 10'1.5

最新更新