繁体   English   中英

使用 Pandas 读取 CSV 时如何在列中保留前导零?

[英]How to keep leading zeros in a column when reading CSV with Pandas?

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

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

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

有没有办法将这个列原封不动地导入为字符串?

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

正如Lev Landau这个问题/答案中所指出的,可能有一个简单的解决方案来为read_csv函数中的某个列使用converters选项。

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

你可以在pandas.io.parsers.read_csv 文档中参考read_csv函数的更多选项。

假设我有如下的 csv 文件projects.csv

project_name,project_id
Some Project,000245
Another Project,000478

例如下面的代码正在修剪前导零:

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:~$

更新,因为它可以帮助其他人:

要将所有列都作为 str,可以这样做(来自评论):

pd.read_csv('sample.csv', dtype = str)

要将大多数或选择性列作为 str,可以这样做:

# lst of column names which needs to be string
lst_str_cols = ['prefix', 'serial']
# use dictionary comprehension to make dict of dtypes
dict_dtypes = {x : 'str'  for x in lst_str_cols}
# use dict on dtypes
pd.read_csv('sample.csv', dtype=dict_dtypes)

这是一个更短、更强大且功能齐全的解决方案:

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

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

将该映射与pd.read_csv()

df = pd.read_csv(yourdata, dtype = dtype_dic)

等等!

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

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)

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

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

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

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

例如,如果宽度为 5,则

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

这将解决问题。 它适用于 pandas==0.23.0 和read_excel

需要 Python3.6 或更高版本。

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

编辑:看看韦斯麦金尼的博客,可能有适合你的东西。 似乎在 11 月有一个来自pandas 0.10的新解析器。

例如,考虑以下 my_data.txt 文件: id,A 03,5 04,6 保留 id 列的前导零: df = pd.read_csv("my_data.txt", dtype={"id": "字符串"}) df

编号 A 0 03 5 1 04 6

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM