Pandas csv-import: сохранить ведущие нули в столбце
Я импортирую данные исследования в кадр данных Pandas, используя read_csv
.
Мои тематические коды состоят из 6 цифр, среди прочего, дня рождения. Для некоторых моих субъектов это приводит к коду с начальным нулем (например, "010816" ).
Когда я импортирую в Pandas, нулевой столбец лишен и столбец отформатирован как int64
.
Есть ли способ импортировать этот столбец без изменений, возможно, в виде строки?
Я попытался использовать пользовательский конвертер для столбца, но он не работает - кажется, что пользовательское преобразование происходит до того, как Pandas преобразуется в int.
Ответы
Ответ 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 или выше.