我有一个如下所示的数据帧
df = pd.DataFrame({'val': ['test','depat','23.1','25.0','31',np.nan]})
我想创建两个新列val_num和val_string
在val_num中,我想存储numeric/int值
在val_string中,我想存储字符串值
所以,我尝试了下面的方法
df['val_num'] = pd.to_numeric(df['val'],errors='coerce') df['val_string'] = (df[pd.to_numeric(df['val'],errors='coerce').isna()])
尽管上面的方法很好用,但是有没有像to_numeric这样的优雅函数来使用to_string识别字符串对象呢?
发布于 3 月前
回答
有没有像to_numeric这样的优雅函数可以使用to_string来识别字符串对象
不,它还不存在。
如果值是混合的-这意味着有可能使用isinstance方法来测试它:
df = pd.DataFrame({'val': ['test','depat',23.1,25.0,31,np.nan]}) df['num'] = df.loc[df['val'].apply(lambda x: isinstance(x, (float, int))), 'val'] df['str'] = df.loc[df['val'].apply(lambda x: isinstance(x, str)), 'val'] print (df) val num str 0 test NaN test 1 depat NaN depat 2 23.1 23.1 NaN 3 25.0 25.0 NaN 4 31 31 NaN 5 NaN NaN NaN
不幸的是,在现实生活中,所有数据都是字符串,因此需要解决方案-首先转换为数字,然后进行处理:
df = pd.DataFrame({'val': ['test','depat','23.1','25.0','31',np.nan]}) df['num'] = df.loc[df['val'].apply(lambda x: isinstance(x, float)), 'val'] df['str'] = df.loc[df['val'].apply(lambda x: isinstance(x, str)), 'val'] print (df) val num str 0 test NaN test 1 depat NaN depat 2 23.1 NaN 23.1 3 25.0 NaN 25.0 4 31 NaN 31 5 NaN NaN NaNdf['num'] = pd.to_numeric(df['val'],errors='coerce') df['vstring'] = df.loc[df['num'].isna(), 'val'] print (df) val num vstring 0 test NaN test 1 depat NaN depat 2 23.1 23.1 NaN 3 25.0 25.0 NaN 4 31 31.0 NaN 5 NaN NaN NaN