python - 将对象从解析的 csv 转换为 int Python

标签 python pandas types

这从我之前的问题中分支出来 - 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_numericerrors='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/

相关文章:

c++ - 初学者 C++ - 在头文件中使用全局常量时遇到问题

java - 如何使用 Google 的 Guava 库提取 Java 中的泛型类型

types - 为什么 Rust 有一个 "Never"原始类型?

python - 分类变量 pandas 总结

pandas - 将具有一个键和多个值的字典转换为数据框

python - 如何拆分列中的多个值并按pandas中的所述值进行分组?

python - 如何使属性比较能够在 SQLAlchemy 中编译为 SQL 表达式?

python - 局部变量也是类变量

python - 如何从 django_nose 覆盖范围中排除代码的特定部分

python - 如何使用 re.match 查找 URL 的第一部分?