python - 将对象从解析的 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
解决方案
这是另一种无需替换的方法:
注意:这可能会很昂贵,因为此解决方案会重塑数据框。
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
推荐阅读
- firebase - 模糊的 Unity Firebase 实时数据库错误:“不支持自定义运行循环”?
- c# - 在 Unity-iOS 中使用 protobuf-net
- c# - 我修改了 1 个变量,但有 2 个改变了
- html - Bootstrap4手风琴不会保持打开状态
- android - 为什么 Play Services OSS 插件显示 maven 工件而不是友好名称?
- android - 如何在ConstraintLayout中水平对齐两个TextView而不重叠?
- ruby-on-rails - 使用 webmock 模拟遏制 Curl::easy
- javascript - 使用 css 或 javascript 在 html 页面中阻止键盘输入
- wpf - WPF:如何为样式中定义的按钮分配单击处理程序
- android - Xamarin.Android 的透明重叠工具栏