2016-08-25 129 views
1

我有一个二进制熊猫数据框,其值为0.0,1.0NaN用`NaN`将稀疏熊猫数据帧转换为整数值

import pandas as pd 
df = pd.read_csv("file.csv") 

我想谈谈花车1.00.0成整数10。不幸的是,由于NaN值,此命令失败:

df.applymap(int) 

的错误是:

ValueError: ('cannot convert float NaN to integer', 'occurred at index 0') 

是否有 “熊猫” 的选择吗?

+0

你想让'NaN'的整数值是什么?输入'0.0,1.0,NaN'应该输出什么? – recursive

+0

@recursive我希望'1.0'为'1','0.0'为'0','NaN'为忽略 – ShanZhengYang

回答

2

UPDATE:

如果需要好看字符串值,你可以做到这一点:

In [84]: df.astype(object) 
Out[84]: 
    a b c 
0 0 1 0 
1 0 0 1 
2 1 1 1 
3 0 1 1 
4 1 1 NaN 

但所有值 - 都是字符串(object在大熊猫而言):

In [85]: df.astype(object).dtypes 
Out[85]: 
a object 
b object 
c object 
dtype: object 

计时500K行DF:

In [86]: df = pd.concat([df] * 10**5, ignore_index=True) 

In [87]: df.shape 
Out[87]: (500000, 3) 

In [88]: %timeit df.astype(object) 
10 loops, best of 3: 113 ms per loop 

In [89]: %timeit df.applymap(lambda x: int(x) if pd.notnull(x) else x).astype(object) 
1 loop, best of 3: 7.86 s per loop 

OLD答案:

AFAIK利用现代大熊猫的版本,你不能做到这一点。

这里是一个演示:

In [52]: df 
Out[52]: 
    a b c 
0 1.0 NaN 0.0 
1 NaN 1.0 1.0 
2 0.0 0.0 NaN 

In [53]: df[pd.isnull(df)] = -1 

In [54]: df 
Out[54]: 
    a b c 
0 1.0 -1.0 0.0 
1 -1.0 1.0 1.0 
2 0.0 0.0 -1.0 

In [55]: df = df.astype(int) 

In [56]: df 
Out[56]: 
    a b c 
0 1 -1 0 
1 -1 1 1 
2 0 0 -1 

我们几乎没有,让我们更换-1NaN

In [57]: df[df < 0] = np.nan 

In [58]: df 
Out[58]: 
    a b c 
0 1.0 NaN 0.0 
1 NaN 1.0 1.0 
2 0.0 0.0 NaN 

另一个演示:

In [60]: df = pd.DataFrame(np.random.choice([0,1], (5,3)), columns=list('abc')) 

In [61]: df 
Out[61]: 
    a b c 
0 1 0 0 
1 1 0 1 
2 0 1 1 
3 0 0 1 
4 0 0 1 

外观与c柱发生如果我们将其中的单个单元更改为NaN

In [62]: df.loc[4, 'c'] = np.nan 

In [63]: df 
Out[63]: 
    a b c 
0 1 0 0.0 
1 1 0 1.0 
2 0 1 1.0 
3 0 0 1.0 
4 0 0 NaN 
+0

最好的答案是'df.astype(object)'。 – ShanZhengYang

+0

@ShanZhengYang,所以你不需要'整数值'作为你的主题状态?你需要看起来像整数的字符串吗? – MaxU

+0

实际上,那也没用......每当我通过'df.to_cvs()'保存矩阵时,它将整数保存为浮点数.....任何其他想法该怎么办? – ShanZhengYang