Python 如果数据类型不正确,如何验证数据类型列并获取名称列?
我试图通过首先为每个列指定我想要的各自的数据类型来验证每个列的数据类型 我正在尝试使用从csv读取的数据Python 如果数据类型不正确,如何验证数据类型列并获取名称列?,python,dataframe,Python,Dataframe,我试图通过首先为每个列指定我想要的各自的数据类型来验证每个列的数据类型 我正在尝试使用从csv读取的数据 In[1]:import numpy as np import pandas as pd In[2]: d = {'ID': [14, 14, 14, 14, 14, 14, 14, 14, 14, np.nan], 'NAME': ['KWI', 'NED', 'RICK', 'NICH', 'DIONIC', 'RICHARD', 'ROCKY', 'CARLO
In[1]:import numpy as np
import pandas as pd
In[2]: d = {'ID': [14, 14, 14, 14, 14, 14, 14, 14, 14, np.nan], 'NAME': ['KWI', 'NED', 'RICK', 'NICH', 'DIONIC', 'RICHARD', 'ROCKY', 'CARLOS', 'SIDARTH%', ' '], 'ID_COUNTRY':[1, 2, 3,4/,5,6,7,8,9,10], 'COUNTRY':['MEXICO', 'ITALY', 'CANADA#', 'ENGLAND', 'GERMANY', 'UNITED STATES', 'JAPAN', 'SPAIN', 'BRAZIL', ''], 'ID_CITY':[10!, 20, 21, 31, 18, 27, 36, 86, 28, np.nan], 'CITY':['MX', 'IT', 'CA', 'ENG', 'GE', 'US', 'JP', 'SP', 'BZ', np.nan], 'STATUS': ['OK', 'OK', 'OK', 'OK', 'OK', 'NOT', 'OK', 'NOT', 'OK','']}
df = pd.DataFrame(data=d)
#df here is show it to get in context but I read it with
#df=pd.read_csv(r'data.csv', encoding='utf8', sep=',')
df
Out[3]: df:
ID NAME ID_COUNTRY COUNTRY ID_CITY CITY STATUS
0 14.0 KWI 1 MEXICO 10! MX OK
1 14.0 NED 2 ITALY 20.0 IT OK
2 14.0 RICK 3 CANADA# 21.0 CA OK
3 14.0 NICH 4/ ENGLAND 31.0 ENG OK
4 14.0 DIONIC 5 GERMANY 18.0 GE OK
5 14.0 RICHARD 6 UNITED STATES 27.0 US NOT
6 14.0 ROCKY 7 JAPAN 36.0 JP OK
7 14.0 CARLOS 8 SPAIN 86.0 SP NOT
8 14.0 SIDHART% 9 BRAZIL 28.0 BZ OK
9 NaN 10 NaN NaN
csv中的数据类型包括:
ID float64
NAME object
ID_COUNTRY object
COUNTRY object
ID_CITY object
CITY object
STATUS object
dtype: object
我需要的是按名称或位置将列分开,如下所示:
a=df.iloc[:,[0,2,4]]
b=df.iloc[:,[1,3,5,6]]
将dtypes
设置为a.astype(“Int64”)
和b.astype(“str”)
,但无法在某些列中查看此转换,因此我需要获取可以转换为所需dtype
的列名。
例如:
ID_COUNTRY has invalid data.
ID_CITY has invalid data.
或者如果有任何可以转换的无效字符串
,也会显示它,但在本例中不是这样,因为我相信几乎所有东西都可以转换为字符串数据类型
我的想法是通过逐列迭代来尝试
for循环
,如果任何列中的值数据无法转换为所需的数据类型
则提示出现该错误的名称列。我尝试了您的代码。正如您所说的,由于数据无效,您无法设置列数据类型
对于a.astype(“Int64”)
,最后一行具有Nan
,它无法转换为Int64
类型。
我的建议是删除此行,或者接受float
作为数据类型
如果使用第一种解决方案:
a.dropna().astype('int')
另外,
ID\u COUNTRY
的代码中有一些输入错误,我尝试了你的代码。正如您所说的,由于数据无效,您无法设置列数据类型
对于a.astype(“Int64”)
,最后一行具有Nan
,它无法转换为Int64
类型。
我的建议是删除此行,或者接受float
作为数据类型
如果使用第一种解决方案:
a.dropna().astype('int')
注:
ID\u COUNTRY
的代码中有一些输入错误,d={…}
行在4/上出现语法错误,还有一个!在那里。这是否来自CSV文件?是的,确实如此。它来自csv,但我想显示数据进行解释。但这就是问题所在。它不是有效的python,因此我无法构建与您类似的df。我可以手动“修复”这些问题,然后a.astype(“int64”)
失败,出现ValueError:当a.astype(“int64”)
工作时,无法将非有限值(NA或inf)转换为整数。问题是,您没有给我们提供a
的数据类型或初始化df的方法,因此我一直在寻找解决方案。如果csv中有一些坏数据,并且带有“4/”的列是一个字符串,您可以使用带有.replace的正则表达式进行修复,然后再将其设置为int64。根据是否要保留nan值,可以a.fillna(0).astype(“int64”)
。。。如果把nan改为零是合理的,好的。我将添加@tdelaneyThatd={…}
行在4/上引发语法错误,并且还有一个!在那里。这是否来自CSV文件?是的,确实如此。它来自csv,但我想显示数据进行解释。但这就是问题所在。它不是有效的python,因此我无法构建与您类似的df。我可以手动“修复”这些问题,然后a.astype(“int64”)
失败,出现ValueError:当a.astype(“int64”)
工作时,无法将非有限值(NA或inf)转换为整数。问题是,您没有给我们提供a
的数据类型或初始化df的方法,因此我一直在寻找解决方案。如果csv中有一些坏数据,并且带有“4/”的列是一个字符串,您可以使用带有.replace的正则表达式进行修复,然后再将其设置为int64。根据是否要保留nan值,可以a.fillna(0).astype(“int64”)
。。。如果把nan改为零是合理的,好的。我将在你的评论中添加@tdelaneyI desagree,因为事实证明,如果你想转换为整数,是否存在NaN
并不重要。如果删除/
和,您可以尝试从列中选择code>,然后设置a.astype(“Int64”)
。嗨,MetalJacket,我已经删除了/
和代码>在我的实验中。将Nan
转换为int
时仍然存在错误。您可以尝试这样做:pd.DataFrame([1,float('nan'))).astype('int')
。弹出错误:ValueError:无法将非有限值(NA或inf)转换为整数
,这很奇怪。我只是删除错误并应用df.iloc[:,[0,2,4]].astype(“Int64)”
并将它们转换为Int64。NAN显示为但在数据类型中显示为Int64.Em。。。真奇怪。我又试了一次。和df.iloc[:,[0,2,4]].astype(“Int64)”
仍然会弹出错误ValueError:无法将非有限值(NA或inf)转换为整数
。。。也许和熊猫版有关?我的是'0.23.4'
很抱歉是:df.iloc[:,[0,2,4]].astype(“Int64”)。我有1.1.1版。也许是这样@Patrick LeeI对您的评论表示赞同,因为事实证明,如果要转换为整数,是否存在NaN
,并不重要。如果删除/
和,您可以尝试从列中选择code>,然后设置a.astype(“Int64”)
。嗨,MetalJacket,我已经删除了/
和代码>在我的实验中。将Nan
转换为int
时仍然存在错误。您可以尝试这样做:pd.DataFrame([1,float('nan'))).astype('int')
。弹出错误:ValueError:无法将非有限值(NA或inf)转换为整数
,这很奇怪。我只是删除错误并应用df.iloc[:,[0,2,4]].astype(“Int64)”
并将它们转换为Int64。NAN显示为但在数据类型中显示为Int64.Em。。。真奇怪。我又试了一次。和df.iloc[:,[0,2,4]].astype(“Int64)”
仍然会弹出错误ValueError:无法将非有限值(NA或inf)转换为整数
。。。也许是吧