我有一个带有数值的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
。