Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Pandas读取CSV时,如何保持列中的前导零?_Python_Pandas_Csv_Types - Fatal编程技术网

Python 使用Pandas读取CSV时,如何保持列中的前导零?

Python 使用Pandas读取CSV时,如何保持列中的前导零?,python,pandas,csv,types,Python,Pandas,Csv,Types,我正在使用read\u csv将研究数据导入熊猫数据框 我的主题代码是6个数字编码,其中包括出生日期。对于我的一些主题,这会导致一个前导为零的代码(例如“010816”) 当我导入Pandas时,前导零被去掉,列的格式为int64 是否有方法将此列导入为字符串 我尝试为列使用自定义转换器,但它不起作用-似乎自定义转换发生在Pandas转换为int之前。我不认为您可以按照您想要的方式指定列类型(如果最近没有更改,并且如果6位数字不是可以转换为datetime的日期)。您可以尝试使用np.genfr

我正在使用
read\u csv
将研究数据导入熊猫数据框

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

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

是否有方法将此列导入为字符串


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

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

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

如中所示,对于
read\u csv
函数中的某一列,可能有一个简单的解决方案使用
转换器
选项

converters={'column_name': lambda x: str(x)}
您可以参考pandas.io.parsers.read_csv中的
read_csv
Function的更多选项

假设我有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,可以这样做(从注释中):

要将大多数或选择性列作为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\u csv()
一起使用:


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

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)

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

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

例如,如果宽度为5,则

data = pd.read_csv('text.csv', converters={'column1': lambda x: f"{x:05}"})
这样就行了。它适用于pandas==0.23.0,也适用于
read\u excel


需要Python3.6或更高版本。

您可以这样做,适用于所有版本的Pandas


pd.read\u csv('filename.csv',dtype={'zero\u column\u name':object})

该版本中的功能现在已经在c-parser分支上完成,应该在0.10版本中发布。我刚刚发布了一个快速版本#2184,很快将包含在即将发布的0.9.1中。但是,是的,在这里使用数据类型应该是首选行为,所以只需在大约一个月左右的时间内留意0.10。如果您升级到github master上的最新版本(即使用转换器),您现在应该可以让它工作了@Changse谢谢,使用最新的github版本,我的转换器确实可以工作!尽管期待0.10更干净的解决方案……Wes Mckinney的博客页面是404。您的可能副本还可以包括许多其他数据类型、
float
和其他数据类型。我相信这是最泛泛的解决方案查询:在dtype_dic json中,为什么str没有引号,但在引号中浮动?我必须循环使用不同列的不同csv。此函数获取所有列映射,并且在表中没有列时不会出错。因此,我能够在一个
dtype\u dic
中定义所有不同表中的所有列(作为字符串读取),并将其用于所有csv。谢谢我相信这也是最好的解决方案:)这对我来说不起作用(python3.6,pandas 0.22.0);我仍然丢失了前导零。如何给出多列??多列:请参阅以上答案中的更新信息。谢谢
df = pd.read_csv("your_file.csv", dtype=str)
data = pd.read_csv('text.csv', converters={'column1': lambda x: f"{x:05}"})