我创建了以下函数来获取数据框,将数字列d类型转换为数字。这是做得很好,但问题是,它也放弃了非数字列,我不想。因为,这些列也携带一些重要的信息。
def convert_dataframe_to_numeric_type(df):
def is_it_a_number(x):
try:
float(x)
return True
except:
return False
df = df[df.applymap(is_it_a_number)]
df = df.dropna(how='all',axis=1)
# after converting all non-numeric elements, transform them to numeric
df = df.transform(pd.to_numeric,errors='ignore')
return df
字符串
2条答案
按热度按时间whlutmcx1#
尝试转换为数字并检查是否为空值将不起作用。几乎所有的数据文件都缺少数值,这些数值将显示为
NA
。像read_csv这样的数据加载函数将为每个空字段 * 和 * 公共NaN标记生成NA默认情况下,以下值被解释为NaN:''、'#N/A'、'#N/A N/A'、'#NA'、'-1.#IND'、'-1.#QNAN'、'-NaN'、'-nan'、' 1.#IND'、'1.#QNAN'、''N/A'、' NA'、'NULL'、' NaN'、'None'、'n/a'、' nan'、'null'。
此外,尝试转换一个系列中的所有值,然后 * 检查是否有失败的结果会执行相同的工作 * 两次 *。Pandas有内置的方法来检测/转换类型,如果转换失败,这些类型将立即停止。
一个选项是infer_object,它尝试检测任何
object
系列的类型。另一个选项是convert_dtypes,它将尝试找到值的最佳类型。使用这个dataframe,其中所有内容都是
object
:字符串
infer_objects()
生成以下类型:型
而
convert_dtypes
更深入:型
8nuwlpux2#
您给出的函数似乎将is_it_a_number函数应用于数据框中的每个单元格,有效地丢弃了任何非数字单元格。这就是丢失不包含数字的列的原因。
您应该检查每一列,以确定它是否可以转换为数字格式,而不是验证每个单元格的数字属性。要实现这一点,您可以使用pd.to_numeric()函数,并附带errors='coerce'参数。这将在给定Series中将所有非数值值与NaN交换。转换完成后,如果结果列不只包含NaN,则保留转换后的列。如果所有值都是NaN,则使用原始列。
下面是函数的调整版本:
字符串