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

将对象从解析的csv转换为int Python,python,pandas,types,Python,Pandas,Types,这偏离了我先前的问题-。我把这当作一个新问题,因为我觉得我遇到的问题完全改变了我的问题 我想将object类型的列中的数据转换为int,因为值是整数 在填充列中的空槽之后,我仍然有错误。我发现csv文件中的第四列被视为对象,而不是int,而不是所有其他列。这是我的密码: import pandas as pd import matplotlib.pyplot as plt import numpy as np file_name = "myfile.csv" df = pd.read_csv

这偏离了我先前的问题-。我把这当作一个新问题,因为我觉得我遇到的问题完全改变了我的问题

我想将object类型的列中的数据转换为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()
将熊猫作为pd导入
将matplotlib.pyplot作为plt导入
将numpy作为np导入
file_name=“myfile.csv”
df=pd.read\u csv(文件名)
replace(r'^\s*$',0,regex=True)
名称=df['name']。值
x=np.arange(len(name))*2
w=0.40
col2=df.columns[1]
col3=df.columns[2]
col4=df.columns[3]
col5=df.columns[4]
打印(df.dtypes)
df[col4]=df[col4].astype(str).astype(int)
dif=df[col4]-df[col3]
颜色=[“红色”表示d<-5,其他“蓝色”表示dif中的d]
plt.bar(x-w,df[col2]。值,宽度=w*0.7,标签=col2,颜色=“青色”)
plt.bar(x,df[col3]。值,宽度=w*0.7,标签=col3,颜色=“绿色”)
plt.bar(x+w,df[col4]。值,宽度=w*0.7,标签=col4,颜色=colors)
plt.plot(x,df[col5]。值,lw=2,label=“Goal”,color=“red”)
plt.xticks(x,名称,旋转=垂直)
plt.ylim([0100])
plt.show()
我将第4个object列转换为int的方法与其他方法一样,是将astype作为字符串追加,然后作为int追加到它的末尾,如代码所示。我还尝试了添加astype int,但也没有成功。下面是我得到的当前错误:
ValueError:int()的文本无效,基数为10

请参阅我上面链接的其他帖子,了解我如何来到这里的所有细节,以防你觉得这会有所帮助

编辑1:根据注释请求,下面是代码执行
df.replace()
之前的csv片段示例

Col1 Col2 Col3 Col4 Col5
4534239818
66025
1805256100

以下是csv:

Col1 Col2 Col3 Col4 Col5
4534239818
6602500
1805256100


正如Chris在评论中提到的,我使用了
df=pd.read\u clipboard()

如果列-n-name中的“name”发生更改,则print语句将给出以下结果:

>>>    Col1  Col2  Col3  Col4   Col5
>>> 0    45    34    23  98.0   18.0
>>> 1    66     0    25   NaN    NaN
>>> 2    18     0    52  56.0  100.0

>>> [45 66 18]
要替换“NaN”,请执行以下操作:

df.fillna(0,inplace=True)
一次将其应用于所有列

因此,如果要更改所有“NaN”,结果如下所示:

   Col1  Col2  Col3  Col4   Col5
0    45    34    23  98.0   18.0
1    66     0    25   0.0    0.0
2    18     0    52  56.0  100.0
对于第4列:
df['Col4'].fillna(0,inplace=True)

打印(df['Col4'].值)
结果:

>[98.0.56.]

我还保存了带/不带fillna选项的clippboarded表中的csv。csv输出如下所示,使用
df.to_csv('blablabla1',sep=',encoding='utf-8')

在df.fillna(0,inplace=True)之前

在df.fillna(0,inplace=True)之后


以下是另一种不用更换的方法:

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

步骤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)


建议的解决方案:

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

如果“强制”,则无效解析将设置为NaN


从这里,我们可以将数据帧作为一个系列,将
pd.应用于带有
errors='concurve'
的数值
,以获得如下原始形状:

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

如果要保存原始的
NaN
,即不将其替换为0,请不要按照上述建议在
df.stack()
中传递
dropna
参数

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


发布您在家长问题和版本中讨论的csv代码片段(如果适用)。(审查结束)。@ZF007我已经按照你的要求更新了帖子。如果你指的是python版本,我使用的是3.8。你已经添加了表格格式的csv。。。我需要有逗号分隔值的实际代码行。。。我没有excel或其他东西来重新创建它。此外,csv有时会隐藏在文件中的模糊代码,当您打开此类文件时可以看到这些代码(有时不需要其他程序进行检查)。把你的问题剪下来,我就知道你的代码示例中有
>Col1 Col2 Col3 Col4 Col5 45 34
@sfr你有
names=df['name']。值
,但示例中没有
ame
列data@Chris这只是一个例子。有一个具有该名称的实际列。我只是用了col1,col2,等等。。。为了显示csv的外观,我以前尝试过这种方法,但由于某些原因它不起作用。它不会用0填充任何插槽。这就是为什么我在代码中使用replace函数的原因。在您的代码中,
df[col4]=df[col4]。astype(str)。astype(int)
抛出一个ValueError:int()的无效文本,以10为底:“98.0”错误。你看到了吗?关闭df.replace()不会在视觉上改变表中的任何内容。所以我在列上做了一个打印,数据在前后都用撇号打印[' 93' ' 78' ' 85' ' 98' ' 91' ' 96' ' 77' ' 50' ' 99' ' 100' ' 87' ' 94' ' 88' ' 96' ' 86' ' 87' ' 90' ' 100' ' 78' ' 83' ' 46' ' 100' 0 ' 12' ' 58' ' 72' ' 90' ' 95''45''95''89''100''90''90']我没有得到值周围的''。在将示例表保存到csv文件并将其用作文件输入后…一切正常。我得到了一个很好的列g
,Col1,Col2,Col3,Col4,Col5
0,45,34,23,98.0,18.0
1,66,0,25,0.0,
2,18,0,52,56.0,100.0
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
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
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