我正在使用read_csv
.
我的主题代码是 6 个数字编码,其中包括出生日期。对于我的一些科目,这会导致代码带有前导零(例如“010816”)。
当我导入 Pandas 时,前导零被去除,列格式为int64
.
有没有办法将这个列原封不动地导入为字符串?
我尝试为该列使用自定义转换器,但它不起作用 - 似乎自定义转换发生在 Pandas 转换为 int 之前。
正如Lev Landau的这个问题/答案中所指出的,可能有一个简单的解决方案来为函数中的某个列使用选项。converters
read_csv
converters={'column_name': lambda x: str(x)}
您可以参考read_csv
pandas.io.parsers.read_csv文档中的更多功能选项。
假设我有projects.csv
如下 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
从那里创建。
编辑:看看 Wes Mckinney 的博客,可能有适合你的东西。似乎有一个新的解析器从pandas 0.10
11 月到来。