首页 > 解决方案 > Pandas.read_csv 类型转换如何工作?

问题描述

使用pandas.read_csvwithparse_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 会说“嘿,伙计,你以为你在读字符串,但实际上它们是数字”很有用。但是当我告诉它不要否决我时,有什么理由否决我?

标签: pythonpandas

解决方案


使用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)  

希望能帮助到你。


推荐阅读