将整个pandas数据帧转换为pandas中的整数(0.17.0)

时间:2016-01-17 22:48:58

标签: python pandas

我的问题与this one非常相似,但我需要转换整个数据框而不仅仅是一系列。 to_numeric函数一次只能在一个系列上运行,并且不能替代已弃用的convert_objects命令。有没有办法在新的pandas版本中获得与convert_objects(convert_numeric=True)命令类似的结果?

谢谢MikeMüller的榜样。如果值都可以转换为整数,则df.apply(pd.to_numeric)非常有效。如果在我的数据框中我有无法转换为整数的字符串怎么办? 示例:

df = pd.DataFrame({'ints': ['3', '5'], 'Words': ['Kobe', 'Bryant']})
df.dtypes
Out[59]: 
Words    object
ints     object
dtype: object

然后我可以运行已弃用的函数并获取:

df = df.convert_objects(convert_numeric=True)
df.dtypes
Out[60]: 
Words    object
ints      int64
dtype: object

运行apply命令会给我带来错误,即使是在尝试和处理之外。

4 个答案:

答案 0 :(得分:70)

所有列都可转换

您可以将该功能应用于所有列:

df.apply(pd.to_numeric)

示例:

>>> df = pd.DataFrame({'a': ['1', '2'], 
                       'b': ['45.8', '73.9'],
                       'c': [10.5, 3.7]})

>>> df.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 2 entries, 0 to 1
Data columns (total 3 columns):
a    2 non-null object
b    2 non-null object
c    2 non-null float64
dtypes: float64(1), object(2)
memory usage: 64.0+ bytes

>>> df.apply(pd.to_numeric).info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 2 entries, 0 to 1
Data columns (total 3 columns):
a    2 non-null int64
b    2 non-null float64
c    2 non-null float64
dtypes: float64(2), int64(1)
memory usage: 64.0 bytes

并非所有列都可转换

pd.to_numeric包含关键字参数errors

  Signature: pd.to_numeric(arg, errors='raise')
  Docstring:
  Convert argument to a numeric type.

Parameters
----------
arg : list, tuple or array of objects, or Series
errors : {'ignore', 'raise', 'coerce'}, default 'raise'
    - If 'raise', then invalid parsing will raise an exception
    - If 'coerce', then invalid parsing will be set as NaN
    - If 'ignore', then invalid parsing will return the input

如果无法将其转换为数字类型,则将其设置为ignore将使列保持不变。

正如Anton Protopopov所指出的,最优雅的方法是将ignore作为关键字参数提供给apply()

>>> df = pd.DataFrame({'ints': ['3', '5'], 'Words': ['Kobe', 'Bryant']})
>>> df.apply(pd.to_numeric, errors='ignore').info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 2 entries, 0 to 1
Data columns (total 2 columns):
Words    2 non-null object
ints     2 non-null int64
dtypes: int64(1), object(1)
memory usage: 48.0+ bytes

我以前建议的方式,使用模块functools中的partial,更详细:

>>> from functools import partial
>>> df = pd.DataFrame({'ints': ['3', '5'], 
                       'Words': ['Kobe', 'Bryant']})
>>> df.apply(partial(pd.to_numeric, errors='ignore')).info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 2 entries, 0 to 1
Data columns (total 2 columns):
Words    2 non-null object
ints     2 non-null int64
dtypes: int64(1), object(1)
memory usage: 48.0+ bytes

答案 1 :(得分:0)

apply() pd.to_numeric errors='ignore' 并将分配回DataFrame:

df = pd.DataFrame({'ints': ['3', '5'], 'Words': ['Kobe', 'Bryant']})
print ("Orig: \n",df.dtypes)

df.apply(pd.to_numeric, errors='ignore')
print ("\nto_numeric: \n",df.dtypes)

df = df.apply(pd.to_numeric, errors='ignore')
print ("\nto_numeric with assign: \n",df.dtypes)

输出:

Orig: 
 ints     object
Words    object
dtype: object

to_numeric: 
 ints     object
Words    object
dtype: object

to_numeric with assign: 
 ints      int64
Words    object
dtype: object

答案 2 :(得分:0)

您可以使用df.astype()将系列转换为所需的数据类型。

例如: my_str_df = [['20','30','40']]

然后: my_int_df = my_str_df ['column_name']。astype(int)#这将是int类型

答案 3 :(得分:0)

使用pd.to_numeric()接受的答案会在需要时立即转换为float。详细阅读问题,它是关于将任何数字列转换为 integer 。 这就是为什么接受的答案需要在所有列上循环才能将数字最终转换为int。

为了完整起见,甚至没有pd.to_numeric()也是可能的;当然,不建议这样做:

df = pd.DataFrame({'a': ['1', '2'], 
                   'b': ['45.8', '73.9'],
                   'c': [10.5, 3.7]})

for i in df.columns:
    try:
        df[[i]] = df[[i]].astype(float).astype(int)
    except:
        pass

print(df.dtypes)

出局:

a    int32
b    int32
c    int32
dtype: object