python - 如何在不转换日期时间列的情况下将对象列转换为 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
?
解决方案
首先是您的数据框示例:
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
推荐阅读
- google-cloud-platform - 删除数据流作业和最大作业数
- python - 努力寻找一种方法让 Tkinter Listbox 有一个删除数组中相应项目的按钮
- python - 如何在使用 zip() 从列表中构建的 pandas-Dataframe 中获取第二个标头
- java - 我想从动态 webtable 列中获取所有链接,然后单击 Selenium 中的每个链接
- sql-server - 负值和正值匹配和更新
- python - Dijkstra 算法实现中的错误
- regex - 非ascii字符未通过java中的正则表达式过滤
- javascript - 咖喱函数导致错误,但如果不咖喱则有效
- arrays - 如何将 Json 对象作为字符串存储在 java 的单列中
- botframework - android 上的团队机器人上没有附件