Pandas csv-import:在列中保持前导零

时间:2012-11-06 11:27:42

标签: python pandas types import-csv

我正在使用read_csv将研究数据导入Pandas数据框。

我的主题代码是6个数字编码,其中包括出生日期。对于我的一些主题,这导致代码具有前导零(例如“010816”)。

当我导入Pandas时,前导零被剥离,列被格式化为int64

有没有办法可以将此列导入为字符串?

我尝试为列使用自定义转换器,但它不起作用 - 好像自定义转换发生在Pandas转换为int之前。

6 个答案:

答案 0 :(得分:34)

this question/answer Lev Landau所述,可能有一个简单的解决方案,可以converters函数中的某个列使用read_csv选项。

converters={'column_name': lambda x: str(x)}

您可以在pandas.io.parsers.read_csv documentation中引用read_csv功能的更多选项。

假设我有csv文件projects.csv,如下所示:

project_name,project_id
Some Project,000245
Another Project,000478

例如下面的代码是triming leading 0:

import csv
from pandas import read_csv

dataframe = read_csv('projects.csv')
print dataframe

结果:

me@ubuntu:~$ python test_dataframe.py 
      project_name  project_id
0     Some Project         245
1  Another Project         478
me@ubuntu:~$

解决方案代码示例:

import csv
from pandas import read_csv

dataframe = read_csv('projects.csv', converters={'project_id': lambda x: str(x)})
print dataframe

必填结果:

me@ubuntu:~$ python test_dataframe.py 
      project_name project_id
0     Some Project     000245
1  Another Project     000478
me@ubuntu:~$

答案 1 :(得分:14)

这是一个更短,更强大且完全可行的解决方案:

只需在变量名称和所需数据类型之间定义映射(字典):

dtype_dic= {'subject_id': str, 
            'subject_number' : 'float'}

将该映射与pd.read_csv()

一起使用
df = pd.read_csv(yourdata, dtype = dtype_dic)
瞧,瞧!

答案 2 :(得分:3)

如果您有很多列,并且您不知道哪些列包含可能会遗漏的前导零,或者您可能只需要自动化代码即可。您可以执行以下操作:

df = pd.read_csv("your_file.csv", nrows=1) # Just take the first row to extract the columns' names
col_str_dic = {column:str for column in list(df)}
df = pd.read_csv("your_file.csv", dtype=col_str_dic) # Now you can read the compete file

您也可以这样做:

df = pd.read_csv("your_file.csv", dtype=str)

这样做,您将所有列都作为字符串,并且不会丢失任何前导零。

答案 3 :(得分:0)

我认为您不能按照您想要的方式指定列类型(如果没有方便地进行更改,并且6位数字​​不是您可以转换为datetime的日期)。您可以尝试使用np.genfromtxt()并从那里创建DataFrame

编辑:看看Wes Mckinney的blog,可能会有适合你的东西。似乎有一个来自pandas 0.10的新解析器将于11月出现。

答案 4 :(得分:0)

如果知道宽度,可以使用converters将数字转换为固定宽度。

例如,如果宽度为5,则

data = pd.read_csv('text.csv', converters={'column1': lambda x: f"{x:05}"})

这可以解决问题。它适用于pandas == 0.23.0,也适用于read_excel

需要Python3.6或更高版本。

答案 5 :(得分:0)

您可以做到这一点,适用于所有版本的熊猫

pd.read_csv('filename.csv', dtype={'zero_column_name': object})