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

use*_*883 41 python types pandas import-csv

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

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

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

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

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

bal*_*jas 38

正如指出这个问题/答案朗道,有可能是一个简单的解决方案使用converters选项中某列的read_csv功能.

converters={'column_name': lambda x: str(x)}
Run Code Online (Sandbox Code Playgroud)

您可以read_csv在pandas.io.parsers.read_csv 文档中参考更多功能选项.

可以说我有csv文件projects.csv如下:

project_name,project_id
Some Project,000245
Another Project,000478
Run Code Online (Sandbox Code Playgroud)

例如,下面的代码是triming前导零:

import csv
from pandas import read_csv

dataframe = read_csv('projects.csv')
print dataframe
Run Code Online (Sandbox Code Playgroud)

结果:

me@ubuntu:~$ python test_dataframe.py 
      project_name  project_id
0     Some Project         245
1  Another Project         478
me@ubuntu:~$
Run Code Online (Sandbox Code Playgroud)

解决方案代码示例

import csv
from pandas import read_csv

dataframe = read_csv('projects.csv', converters={'project_id': lambda x: str(x)})
print dataframe
Run Code Online (Sandbox Code Playgroud)

要求的结果:

me@ubuntu:~$ python test_dataframe.py 
      project_name project_id
0     Some Project     000245
1  Another Project     000478
me@ubuntu:~$
Run Code Online (Sandbox Code Playgroud)

  • 如何给多列? (2认同)

ℕʘʘ*_*ḆḽḘ 18

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

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

dtype_dic= {'subject_id': str, 
            'subject_number' : 'float'}
Run Code Online (Sandbox Code Playgroud)

使用该映射pd.read_csv():

df = pd.read_csv(yourdata, dtype = dtype_dic)
Run Code Online (Sandbox Code Playgroud)

瞧!

  • 查询:在 dtype_dic json 中,为什么 str 没有引号但在引号中浮动? (2认同)

Eri*_*uez 7

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

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
Run Code Online (Sandbox Code Playgroud)

您也可以这样做:

df = pd.read_csv("your_file.csv", dtype=str)
Run Code Online (Sandbox Code Playgroud)

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


小智 6

你可以做到这一点,适用于所有版本的 Pandas

pd.read_csv('filename.csv', dtype={'zero_column_name': object})
Run Code Online (Sandbox Code Playgroud)


roo*_*oot 0

我认为您无法按照您想要的方式指定列类型(如果最近没有更改并且 6 位数字不是可以转换为日期时间的日期)。您可以尝试使用np.genfromtxt()并从那里创建DataFrame

编辑:看看韦斯·麦金尼的博客,可能有适合你的东西。似乎pandas 0.1011 月份就会有一个新的解析器。