首页 > 解决方案 > 如何在不转换日期时间列的情况下将对象列转换为 int 和 float 列

问题描述

我将表格加载到熊猫中,如下所示:

import pandas as pd
df=pd.read_excel(file.xlsx,dtype=object)
A   B         C        D
1   2.0   1-02-1997   sam
Nan 2.3   3-08-1997   ram
2   nan   2-03-1997   pam

然后我正在替换 NaN 值

df=df.fillna(method='ffill')

然后我将列转换为 int 并使用

for c in df.columns:
   df[c]=pd.to_numeric(df[c],error='ignore')

但这会将日期时间列也转换为int/float. 有没有办法将日期时间转换限制为int/float

标签: pythonpandas

解决方案


首先是您的数据框示例:

df = pd.read_csv(StringIO('''A   B         C        D
1   2.0   1-02-1997   sam
Nan 2.3   3-08-1997   ram
2   nan   2-03-1997   pam'''),sep=r'\s+')
df=df.fillna(method='ffill')
df
>>> A   B   C   D
0   1   2.0 1-02-1997   sam
1   Nan 2.3 3-08-1997   ram
2   2   2.3 2-03-1997   pam

你可以用一个try .. except语句来指出错误:

def to_numeric(col):
    try:
        return pd.to_numeric(col,error='ignore')
    except:
        return col
    
for c in df.columns:
   df[c]= to_numeric(df[c])

list(map(str,df.dtypes))
>>>['object', 'float64', 'object', 'object']

请注意,列 A 不能变成 int 并且它保持“对象”,所以我的建议是在失败时将 evetithing 变为浮动...

我的实现:

def to_numeric(col):
    try:
        return pd.to_numeric(col,error='ignore')
    except:
        try:
            return col.astype(float)
        except:
            return col
    
for c in df.columns:
   df[c]= to_numeric(df[c])

list(map(str,df.dtypes))
>>>['float64', 'float64', 'object', 'object']
df = df.ffill()
>>> A   B   C   D
0   1.0 2.0 1-02-1997   sam
1   1.0 2.3 3-08-1997   ram
2   2.0 2.3 2-03-1997   pam
 

推荐阅读