这与我之前提出的问题相关,在这里:Replace any string in columns with 1
然而,由于很久以前就回答了这个问题,我在这里开始提出一个新问题。我本质上是尝试使用convert_objects将字符串值替换为以下数据帧中的1(在此缩写):
uniq_epoch T_Opp T_Eval
1 0 0
1 0 vv.bo
2 bx 0
3 0 0
3 vo.bp 0
...
我使用以下代码执行此操作。我实际上尝试在整个数据帧上使用此代码,并将其应用于特定列。结果每次都没有错误消息,但也没有更改数据(没有值转换为NaN,dtype仍然是'O')。
df = df.convert_objects(convert_numeric = True)
或
df.T_Eval = df.T_Eval.convert_objects(convert_numeric=True)
所需的最终输出如下:
uniq_epoch T_Opp T_Eval
1 0 0
1 0 1
2 1 0
3 0 0
3 1 0
...
在此之前可能还有一个步骤,其中1为NaN,而fillna(1)用于在字符串中插入1s。
我已经在stackoverflow上搜索了帖子,并查看了convert_objects的文档,但不幸的是它很稀疏。如果不是上一篇文章(上面链接),我甚至不会尝试以这种方式应用它。
我还要提到这些列中有相当多的字符串(代码),并且代码可以重新组合,因此使用dict和replace()执行此操作需要大约相同的时间好像我是手工做的。
基于上一篇文章和我能够找到的各种资源,我无法弄清楚为什么这不起作用 - 任何帮助都非常赞赏,包括指向进一步的文档。
答案 0 :(得分:4)
这是0.13.1
也许你有一个旧版本; IIRC convert_objects
在0.11中引入。
In [5]: df = read_csv(StringIO(data),sep='\s+',index_col=0)
In [6]: df
Out[6]:
T_Opp T_Eval
uniq_epoch
1 0 0
1 0 vv.bo
2 bx 0
3 0 0
3 vo.bp 0
[5 rows x 2 columns]
In [7]: df.convert_objects(convert_numeric=True)
Out[7]:
T_Opp T_Eval
uniq_epoch
1 0 0
1 0 NaN
2 NaN 0
3 0 0
3 NaN 0
[5 rows x 2 columns]
In [8]: df.convert_objects(convert_numeric=True).dtypes
Out[8]:
T_Opp float64
T_Eval float64
dtype: object
In [9]: df.convert_objects(convert_numeric=True).fillna(1)
Out[9]:
T_Opp T_Eval
uniq_epoch
1 0 0
1 0 1
2 1 0
3 0 0
3 1 0
[5 rows x 2 columns]