pandas在导入外部文件为二位矩阵时,会出先某一列元素同时含有多种数据类型的情况(如字符串、浮点数、整数等)
导入数据时出现如下提示:
DtypeWarning: Columns 1 have mixed types. Specify dtype option on import or set low_memory=False.
interactivity=interactivity, compiler=compiler, result=result)
由于python用不同的储存格式来储存不同类型的数据,所以这里报错跟memory有关。
通常需要对dataframe中的某一列进行计算,而如果某一列中含有字符串等类型的数据时,无法计算,有以下几种解决方案。
1. 直接尝试在导入时设定数据类型(dtype),或者转换为浮点类型(astype)
file = pd.read_tabel("file1", sep = "\s+", names=["a","b"], dtype={"a":np.float64})
或者
file["a"].astype(float)
以上方法可以把字符串转换为浮点数。然而,当该列中有字母组成的字符串时,会报错,因为你不可能把字母转换成浮点数。由于这些字母无法计算,需要去除才行。
2. 尝试利用pandas.is.digit函数来判断哪些是数字组成的字符串,哪些是字母组成的字符串
file = pd.read_tabel("file1", sep = "\s+", names=["a","b"], dtype={"a":"str"})
index = file["a"].str.isdigit()
file = file.iloc[index]
第一步首先都以字符串的格式导入,第二步用.str.isdigit()来判断字符串是有数字组成还是字母组成,构建索引,就得到第三步去除字母的文件。但是这里执行之后发现,由小数(浮点数)组成的字符串使用str.isdigit()无法判断为数字,因为浮点数中的小数点“.”被该函数认定不是数字。比如:
w = pd.Series(["aa","222","22.2"])
w.str.isdigit()
False, True, False
所以当文件列中同时含有由小数和字母组成的字符串时,只能采取第3种方法
3. 创建函数判断字符串是由数字(包括浮点数)还是字母组成
def is_number():
try:
x = float(x)
return True
except ValueError:
return False
index = file["a"].map(is_number)
file = file.iloc[index]
首先构构建函数,第二步得到boolen值索引,第三步得到去除字母的文件,完美解决。