python - Pandas.read_csv 类型转换如何工作?
问题描述
使用pandas.read_csv
withparse_dates
选项和自定义日期解析器,我发现 Pandas 对它正在读取的数据类型有自己的想法。
样本 csv:
"birth_date", "name"
"","Dr. Who"
"1625", "Rembrandt"
"1533", "Michel"
实际的 datecleaner 在这里,但我所做的归结为:
import pandas as pd
def dateclean(date):
return str(int(date)) # Note: we return A STRING
df = pd.read_csv(
'my.csv',
parse_dates=['birth_date'],
date_parser=dateclean,
engine='python'
)
print(df.birth_date)
输出:
0 NaN
1 1625.0
2 1533.0
Name: birth_date, dtype: float64
我得到类型float64
,即使我指定了str
。另外,取出 CSV 中的第一行,即出生日期为空的那一行,我得到 type int
。解决方法很简单:
return '"{}"'.format(int(date))
有没有更好的办法?
在数据分析中,我可以想象 Pandas 会说“嘿,伙计,你以为你在读字符串,但实际上它们是数字”很有用。但是当我告诉它不要否决我时,有什么理由否决我?
解决方案
使用parse_dates
/date_parser
对我来说看起来有点复杂,除非您想在许多日期列上概括您的导入。我认为你对converters
参数有更多的控制,你可以在哪里适应dateclean()
函数。您也可以尝试使用dtype
参数。
原始dateclean()
函数的问题在于它在""
值上失败,因为int("")
raises ValueError
。当遇到这个问题时,Pandas 似乎会求助于标准导入,但它会以converters
.
下面是演示修复的代码:
import pandas as pd
from pathlib import Path
doc = """"birth_date", "name"
"","Dr. Who"
"1625", "Rembrandt"
"1533", "Michel"
"""
Path('my.csv').write_text(doc)
def dateclean(date):
try:
return str(int(date))
except ValueError:
return ''
df = pd.read_csv(
'my.csv',
parse_dates=['birth_date'],
date_parser=dateclean,
engine='python'
)
df2 = pd.read_csv(
'my.csv',
converters = {'birth_date': dateclean}
)
print(df2.birth_date)
希望能帮助到你。
推荐阅读
- c++ - 设置成员变量值后,该值在 getter 函数内部发生变化
- php - Laravel Eloquent 3 个表 + 1 个数据透视表
- websocket - 很多 tcp 窗口更新大小段
- python - 为什么它说左上角没有在函数pygame中定义?
- html - 下划线元素并在导航栏上使用滑动下划线增加它们之间的距离
- post - yii2 从 pust 多字段中获取值
- javascript - React Native javascript 合并多主题参数
- javascript - 使用JavaScript,如何在单击元素外单击时如何复制DIV的行为?
- mysql - 如何根据日期获取不同的行数
- javascript - 如何在另一个模块中使用服务/模块?