Подтвердить что ты не робот

Pandas csv-import: сохранить ведущие нули в столбце

Я импортирую данные исследования в кадр данных Pandas, используя read_csv.

Мои тематические коды состоят из 6 цифр, среди прочего, дня рождения. Для некоторых моих субъектов это приводит к коду с начальным нулем (например, "010816" ).

Когда я импортирую в Pandas, нулевой столбец лишен и столбец отформатирован как int64.

Есть ли способ импортировать этот столбец без изменений, возможно, в виде строки?

Я попытался использовать пользовательский конвертер для столбца, но он не работает - кажется, что пользовательское преобразование происходит до того, как Pandas преобразуется в int.

4b9b3361

Ответ 1

Как указано в этом вопросе/ответе Лев Ландау, может быть простое решение использовать converters для определенного столбца в функции read_csv.

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

Вы можете обратиться к дополнительным функциям read_csv funtion в pandas.io.parsers.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

Результат:

[email protected]:~$ python test_dataframe.py 
      project_name  project_id
0     Some Project         245
1  Another Project         478
[email protected]:~$

Пример кода решения:

import csv
from pandas import read_csv

dataframe = read_csv('projects.csv', converters={'project_id': lambda x: str(x)})
print dataframe

Требуемый результат:

[email protected]:~$ python test_dataframe.py 
      project_name project_id
0     Some Project     000245
1  Another Project     000478
[email protected]:~$

Ответ 2

вот более короткое, надежное и полностью работающее решение:

просто определите отображение (словарь) между именами переменных и желаемым типом данных:

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

используйте это сопоставление с pd.read_csv():

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

et voila!

Ответ 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)

Делая это, вы будете иметь все свои столбцы в виде строк, и вы не потеряете ни одного начального нуля.

Ответ 4

Я не думаю, что вы можете указать тип столбца так, как вы хотите (если не были внесены изменения, и если 6-значное число не является датой, которую вы можете преобразовать в datetime). Вы можете попробовать использовать np.genfromtxt() и создать DataFrame оттуда.

EDIT: взгляните на Wes Mckinney blog, может быть что-то для вас. Похоже, что в ноябре появится новый парсер из pandas 0.10.

Ответ 5

Вы можете использовать converters для преобразования числа в фиксированную ширину, если вы знаете ширину.

Например, если ширина равна 5, то

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

Это сделает свое дело. Это работает для панд == 0.23.0, а также read_excel.

Требуется Python3.6 или выше.