我有一个二进制pandas数据框,其值为0.0
,1.0
和NaN
。
import pandas as pd
df = pd.read_csv("file.csv")
我想将浮动1.0
和0.0
转换为整数1
和0
。不幸的是,由于NaN
值,此命令失败:
df.applymap(int)
错误是:
ValueError: ('cannot convert float NaN to integer', 'occurred at index 0')
是否有“熊猫”替代品?
答案 0 :(得分:2)
<强>更新强>
如果你需要漂亮的字符串值,你可以这样做:
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
但所有值都是字符串(pandas术语中为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
我们差不多了,让我们用-1
替换NaN
:
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
列会发生什么:
{{1}}
答案 1 :(得分:2)
从熊猫0.24(2019年1月)开始,您可以通过使用nullable integers而不需要解决object
来实现所需的功能。使用@MaxU的示例:
In [125]: df
Out[125]:
a b c
0 0 1 0.0
1 0 0 1.0
2 1 1 1.0
3 0 1 1.0
4 1 1 NaN
In [126]: df.astype('Int64')
Out[126]:
a b c
0 0 1 0
1 0 0 1
2 1 1 1
3 0 1 1
4 1 1 NaN