我经常在解析数据文件时收到此警告:
WARNING:py.warnings:/usr/local/python3/miniconda/lib/python3.4/site-
packages/pandas-0.16.0_12_gdcc7431-py3.4-linux-x86_64.egg/pandas
/io/parsers.py:1164: DtypeWarning: Columns (0,2,14,20) have mixed types.
Specify dtype option on import or set low_memory=False.
data = self._reader.read(nrows)
但是如果数据很大(我有50k行),我如何在数据中找到dtype的变化?
答案 0 :(得分:17)
我不完全确定你所追求的是什么,但是很容易找到包含不共享第一行类型的元素的行。例如:
>>> df = pd.DataFrame({"A": np.arange(500), "B": np.arange(500.0)})
>>> df.loc[321, "A"] = "Fred"
>>> df.loc[325, "B"] = True
>>> weird = (df.applymap(type) != df.iloc[0].apply(type)).any(axis=1)
>>> df[weird]
A B
321 Fred 321
325 325 True
答案 1 :(得分:3)
除了DSM的回答,使用多列数据框,找到更改类型的列会很有帮助:
for col in df.columns:
weird = (df[[col]].applymap(type) != df[[col]].iloc[0].apply(type)).any(axis=1)
if len(df[weird]) > 0:
print(col)
答案 2 :(得分:1)
此方法使用pandas.api.types.infer_dtype
查找具有混合dtypes的列。它已在Python 3.8下使用Pandas 1进行了测试。
请注意,此答案具有assignment expressions的多种用法,这些用法仅适用于Python 3.8或更高版本。但是,可以对其进行简单地修改以使其不使用。
if mixed_dtypes := {c: dtype for c in df.columns if (dtype := pd.api.types.infer_dtype(df[c])).startswith("mixed")}:
raise TypeError(f"Dataframe has one more mixed dtypes: {mixed_dtypes}")
但是,这种方法无法找到具有更改的dtype的行。