将对象从解析的csv转换为int Python
这偏离了我先前的问题-。我把这当作一个新问题,因为我觉得我遇到的问题完全改变了我的问题 我想将object类型的列中的数据转换为int,因为值是整数 在填充列中的空槽之后,我仍然有错误。我发现csv文件中的第四列被视为对象,而不是int,而不是所有其他列。这是我的密码:将对象从解析的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
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 Col54534239818
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