我使用进口的研究数据为大熊猫数据帧read_csv
。
我的主题代码是6位数字编码,除其他外,诞生的那天。 对于我的一些科目,这导致代码带前导零(例如“010816”)。
当我导入到大熊猫,前导零被剥离和列被格式化为int64
。
有没有一种方法来导入此列不变,也许作为一个字符串?
我试图用一个自定义转换为列,但它不工作 - 它好像自定义转换发生大熊猫转换为int之前。
我使用进口的研究数据为大熊猫数据帧read_csv
。
我的主题代码是6位数字编码,除其他外,诞生的那天。 对于我的一些科目,这导致代码带前导零(例如“010816”)。
当我导入到大熊猫,前导零被剥离和列被格式化为int64
。
有没有一种方法来导入此列不变,也许作为一个字符串?
我试图用一个自定义转换为列,但它不工作 - 它好像自定义转换发生大熊猫转换为int之前。
正如指出这个问题/答案由朗道 ,有可能是一个简单的解决方案使用converters
选项中某列的read_csv
功能。
converters={'column_name': lambda x: str(x)}
你可以参考更多的选择read_csv
pandas.io.parsers.read_csv在funtion 文档 。
可以说我有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:~$
这里是一个短,功能强大和全面工作液:
简单地定义的变量名和所需的数据类型之间的映射(字典):
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)
通过这样做,你将有你所有的列作为字符串,你不会失去任何前导零。
我不认为你可以指定一栏键入您希望的方式(如果还没有改变reciently如果6位数字是不是你可以转换为datetime的日期)。 你可以尝试使用np.genfromtxt()
并创建DataFrame
从那里。
编辑:看看韦斯麦金尼的博客 ,可能有东西给你。 这似乎是不存在从一个新的解析器pandas 0.10
十一月到来。
您可以使用converters
到数字转换为固定的宽度,如果你知道的宽度。
例如,如果宽度是5,则
data = pd.read_csv('text.csv', converters={'column1': lambda x: f"{x:05}"})
这将这样的伎俩。 它适用于大熊猫== 0.23.0也read_excel
。
Python3.6或更高的要求。