Panda:更改列的数据类型

问题:

我想将一个表(以列表的形式表示)转换成一个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中引入)将列或系列转换为数字类型。该函数也可以使用apply的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

多列/整个DataFrames

我们可能希望将此操作应用于多个列。依次处理每一列是乏味的,所以我们可以使用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')

然后该函数将应用于whole DataFrame。可以转换为数字类型的列将被转换,而不能(例如它们包含非数字字符串或日期)的列将被单独使用。
还有pd.to_datetimepd.to_timedelta转换为日期和时间戳。

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Pandas: change data type of columns

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

2 + 4 =