这从我之前的问题中分支出来 - 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()
我将第四个对象列转换为 int 的方法与其他方法一样,是将 astype 作为字符串附加,然后将 int 作为 int 附加到其末尾,如我的代码所示。我也尝试仅附加 astype int 但这也不起作用。这是我收到的当前错误:ValueError: invalid literal for int() with base 10
请参阅我上面链接的另一篇文章,了解我如何到达这里的所有详细信息,以防您认为这会有所帮助。
编辑 1:根据评论请求,这里是代码执行 df.replace()
之前的 csv 片段示例。 。
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
最佳答案
这是另一种无需替换的方法:
注意:这可能会很昂贵,因为此解决方案会 reshape 数据帧。
第 1 步:创建数据框:
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
关于python - 将对象从解析的 csv 转换为 int Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59505843/