将带有NaNs的字符串转换为pint中的int

时间:2019-04-09 02:41:39

标签: python pandas

我有一个pandas数据框,所有值都是字符串。有些是“无”,其余的是整数,但采用字符串格式,例如“ 123456”。如何将所有“无”都转换为np.nan,将其他所有“无”转换为整数,例如123456。

df = {'col1': ['1', 'None'], 'col2': ['None', '123']}

将df转换为:

df = {'col1': [1, NaN], 'col2': [NaN, 123]}

3 个答案:

答案 0 :(得分:3)

使用以下代码:

print(df.replace('None', np.nan).astype(float))

输出:

   col1   col2
0   1.0    NaN
1   NaN  123.0

您必须使用replace

P.S。如果df是字典,请先将其转换:

df = pd.DataFrame(df)

答案 1 :(得分:3)

您可以将列转换为Nullable Integer类型(0.24以上版本中的新功能):

d = {'col1': ['1', 'None'], 'col2': ['None', '123']}
res = pd.DataFrame({
    k: pd.to_numeric(v, errors='coerce') for k, v in d.items()}, dtype='Int32')
res

   col1  col2
0     1   NaN
1   NaN   123

使用此解决方案,数字数据将转换为整数(但丢失的数据仍为NaN):

res.to_dict()
# {'col1': [1, nan], 'col2': [nan, 123]}

在旧版本中,初始化DataFrame时转换为object

res = pd.DataFrame({
    k: pd.to_numeric(v, errors='coerce') for k, v in d.items()}, dtype=object)
res

  col1 col2
0    1  NaN
1  NaN  123

它与上面的可为空的类型解决方案不同,只是表示形式发生了变化,而不是实际数据。

res.to_dict()
#  {'col1': [1.0, nan], 'col2': [nan, 123.0]}

答案 2 :(得分:1)

您还可以使用:

import pandas as pd
d = {'col1': ['1', 'None'], 'col2': ['None', '123']}
df = pd.DataFrame.from_dict(d).replace("None", value=pd.np.nan).astype(float)

   col1   col2
0   1.0    NaN
1   NaN  123.0

col1    1 non-null float64
col2    1 non-null float64
dtypes: float64(2)