首页 > 解决方案 > 将对象从解析的 csv 转换为 int Python

问题描述

这分支了我之前的问题 - Filling Null Spots in CSV in Python。我把这个问题变成了一个新问题,因为我觉得我遇到的问题已经完全改变了我的问题。

我想将对象类型列中的数据转换为 int,因为值是整数。

填充列中的空槽后,我仍然有错误。我发现我的 csv 文件中的第四列被视为一个对象而不是 int 而不是所有其他列。这是我的代码:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np


file_name = "myfile.csv"
df = pd.read_csv(file_name)
df.replace(r'^\s*$', 0, regex=True)
names = df['name'].values

x = np.arange(len(names))*2
w = 0.40

col2 = df.columns[1]
col3 = df.columns[2]
col4 = df.columns[3]
col5 = df.columns[4]

print(df.dtypes)
df[col4] = df[col4].astype(str).astype(int)

dif = df[col4] - df[col3]

colors = ['Red' if d < -5 else 'Blue' for d in dif]

plt.bar(x-w, df[col2].values, width=w*0.7, label=col2, color = "cyan")
plt.bar(x, df[col3].values, width=w*0.7, label=col3, color = "green")
plt.bar(x+w, df[col4].values, width=w*0.7, label=col4, color = colors)
plt.plot(x, df[col5].values, lw=2, label="Goal", color = "red")

plt.xticks(x, names, rotation='vertical')
plt.ylim([0,100])

plt.show()

我将第 4 个对象列转换为 int 的方法是,将 astype 作为字符串附加,然后作为 int 附加到它的末尾,如我的代码所示。我也尝试仅附加 astype int 但这也不起作用。这是我得到的当前错误:ValueError: invalid literal for int() with base 10

请参阅我上面链接的另一篇文章,了解我如何到达这里的所有详细信息,以防你觉得它会有所帮助。

编辑 1:根据评论请求,这是代码执行df.replace().

Col1 Col2 Col3 Col4 Col5
  45 34 23 98 18
  66 0 25    
  18 0 52 56 100

这是之后的csv:

Col1 Col2 Col3 Col4 Col5
  45 34 23 98 18
  66 0 25 0 0
  18 0 52 56 100

标签: pythonpandastypes

解决方案


这是另一种无需替换的方法:

注意:这可能会很昂贵,因为此解决方案会重塑数据框。

Step1:创建数据框:

s="""
Col1,Col2,Col3,Col4,Col5
45,34,23,98,18
66, ,25, 
18, ,52,56,100
"""
from io import StringIO
df = pd.read_csv(StringIO(s))
print(df)

   Col1 Col2  Col3 Col4   Col5
0    45   34    23   98   18.0
1    66         25         NaN
2    18         52   56  100.0

建议的解决方案:

从这里开始,如果您知道所有列都有数值,则可以使用该pd.to_numeric函数,并将errors参数设置为coerce。从文档中,我们可以看到强制将无效的数字条目解析为NaN

If ‘coerce’, then invalid parsing will be set as NaN


从这里我们可以stack()将数据框作为一个系列,我们在其上应用pd.to_numeric并返回以获得原始形状,如下所示errors='coerce'unstack()

s=df.stack(dropna=False)
final=pd.to_numeric(s,errors='coerce').fillna(0).unstack()
print(final)

   Col1  Col2  Col3  Col4   Col5
0  45.0  34.0  23.0  98.0   18.0
1  66.0   0.0  25.0   0.0    0.0
2  18.0   0.0  52.0  56.0  100.0

如果您想保存原始NaN文件,即不将它们替换为 0,请不要按照上面的建议传递dropna参数。df.stack()

s=df.stack()
final=pd.to_numeric(s,errors='coerce').fillna(0).unstack()
print(final)

   Col1  Col2  Col3  Col4   Col5
0  45.0  34.0  23.0  98.0   18.0
1  66.0   0.0  25.0   0.0    NaN
2  18.0   0.0  52.0  56.0  100.0

推荐阅读