python - pandas查看数据类型 - to_numeric




更改Pandas中列的数据类型 (4)

如何创建两个数据框,每个数据框的列都有不同的数据类型,然后将它们附加在一起?

d1 = pd.DataFrame(columns=[ 'float_column' ], dtype=float)
d1 = d1.append(pd.DataFrame(columns=[ 'string_column' ], dtype=str))

结果

In[8}:  d1.dtypes
Out[8]: 
float_column     float64
string_column     object
dtype: object

在创建数据框之后,可以在第1列中填充浮点变量,在第2列中填充字符串(或任何您想要的数据类型)。

我想将一个表格(表示为列表清单)转换为Pandas DataFrame。 作为一个非常简单的例子:

a = [['a', '1.2', '4.2'], ['b', '70', '0.03'], ['x', '5', '0']]
df = pd.DataFrame(a)

将列转换为适当类型的最佳方式是什么?在这种情况下,第2列和第3列转换为浮点型? 有没有办法在转换为DataFrame时指定类型? 或者先创建DataFrame然后循环遍历列来更改每列的类型会更好吗? 理想情况下,我希望以动态的方式进行此操作,因为可能有数百个列,而且我不想明确指定哪些列是哪种类型。 我只能保证每列都包含相同类型的值。


您可以使用pd.to_numeric (在版本0.17中引入)将列或系列转换为数字类型。 该函数也可以应用在DataFrame的多列上。

重要的是,该函数还会带有一个errors关键字参数,它允许您强制非数值为NaN ,或者简单地忽略包含这些值的列。

示例使用如下所示。

个别专栏/系列

以下是使用具有对象dtype的一系列字符串s的示例:

>>> s = pd.Series(['1', '2', '4.7', 'pandas', '10'])
>>> s
0         1
1         2
2       4.7
3    pandas
4        10
dtype: object

该函数的默认行为是在不能转换值时引发。 在这种情况下,它不能应付字符串'熊猫':

>>> pd.to_numeric(s) # or pd.to_numeric(s, errors='raise')
ValueError: Unable to parse string

我们可能不希望'熊猫'被认为是缺失/不良的价值,而不是失败。 我们可以将无效值强制转换为NaN ,如下所示:

>>> pd.to_numeric(s, errors='coerce')
0     1.0
1     2.0
2     4.7
3     NaN
4    10.0
dtype: float64

第三个选项只是在遇到无效值时忽略该操作:

>>> pd.to_numeric(s, errors='ignore')
# the original Series is returned untouched

多列/整个数据帧

我们可能希望将此操作应用于多个列。 依次处理每一列是很枯燥的,所以我们可以使用DataFrame.apply来让这个函数对每一列起作用。

从问题中借用DataFrame:

>>> a = [['a', '1.2', '4.2'], ['b', '70', '0.03'], ['x', '5', '0']]
>>> df = pd.DataFrame(a, columns=['col1','col2','col3'])
>>> df
  col1 col2  col3
0    a  1.2   4.2
1    b   70  0.03
2    x    5     0

然后我们可以写:

df[['col2','col3']] = df[['col2','col3']].apply(pd.to_numeric)

现在'col2'和'col3'根据需要具有dtype float64

但是,我们可能不知道我们的哪些列可以可靠地转换为数字类型。 在这种情况下,我们可以写出:

df.apply(pd.to_numeric, errors='ignore')

然后该函数将应用于整个 DataFrame。 可以转换为数字类型的列将被转换,而不能(例如,它们包含非数字字符串或日期)的列将被单独保留。

还有pd.to_datetimepd.to_timedelta用于转换为日期和时间戳。

软转换

版本0.21.0引入了用于将具有对象数据类型的DataFrame的列转换为更具体类型的方法infer_objects()

例如,我们创建一个DataFrame,其中包含两列对象类型,一列保存整数,另一列保存整数字符串:

>>> df = pd.DataFrame({'a': [7, 1, 5], 'b': ['3','2','1']}, dtype='object')
>>> df.dtypes
a    object
b    object
dtype: object

然后使用infer_objects() ,我们可以将列'a'的类型更改为int64:

>>> df = df.infer_objects()
>>> df.dtypes
a     int64
b    object
dtype: object

因为它的值是字符串,而不是整数,所以列'b'一直保留。 如果我们试图强制将两列转换为整数类型,我们可以使用df.astype(int)来代替。


这个怎么样?

a = [['a', '1.2', '4.2'], ['b', '70', '0.03'], ['x', '5', '0']]
df = pd.DataFrame(a, columns=['one', 'two', 'three'])
df
Out[16]: 
  one  two three
0   a  1.2   4.2
1   b   70  0.03
2   x    5     0

df.dtypes
Out[17]: 
one      object
two      object
three    object

df[['two', 'three']] = df[['two', 'three']].astype(float)

df.dtypes
Out[19]: 
one       object
two      float64
three    float64

这是一个函数,它将DataFrame和列的列表作为参数,并将列中的所有数据强制转换为数字。

# df is the DataFrame, and column_list is a list of columns as strings (e.g ["col1","col2","col3"])
# dependencies: pandas

def coerce_df_columns_to_numeric(df, column_list):
    df[column_list] = df[column_list].apply(pd.to_numeric, errors='coerce')

所以,举个例子:

import pandas as pd

def coerce_df_columns_to_numeric(df, column_list):
    df[column_list] = df[column_list].apply(pd.to_numeric, errors='coerce')

a = [['a', '1.2', '4.2'], ['b', '70', '0.03'], ['x', '5', '0']]
df = pd.DataFrame(a, columns=['col1','col2','col3'])

coerce_df_columns_to_numeric(df, ['col2','col3'])




casting