我正在使用read_csv
将研究数据导入Pandas数据框。
我的主题代码是6个数字编码,其中包括出生日期。对于我的一些主题,这导致代码具有前导零(例如“010816”)。
当我导入Pandas时,前导零被剥离,列被格式化为int64
。
有没有办法可以将此列导入为字符串?
我尝试为列使用自定义转换器,但它不起作用 - 好像自定义转换发生在Pandas转换为int之前。
答案 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})