pandas
Инструменты ввода-вывода Pandas (считывание и сохранение наборов данных)
Поиск…
замечания
Официальная документация pandas включает страницу в IO Tools со списком соответствующих функций для чтения и записи в файлы, а также некоторые примеры и общие параметры.
Чтение csv-файла в DataFrame
Пример для чтения файла data_file.csv
например:
Файл:
index,header1,header2,header3
1,str_data,12,1.4
3,str_data,22,42.33
4,str_data,2,3.44
2,str_data,43,43.34
7, str_data, 25, 23.32
Код:
pd.read_csv('data_file.csv')
Выход:
index header1 header2 header3
0 1 str_data 12 1.40
1 3 str_data 22 42.33
2 4 str_data 2 3.44
3 2 str_data 43 43.34
4 7 str_data 25 23.32
Некоторые полезные аргументы:
sep
Поле по умолчанию разделителем является запятая,
. Используйте эту опцию, если вам нужен другой разделитель, напримерpd.read_csv('data_file.csv', sep=';')
index_col
Сindex_col = n
(n
целым числом) вы указываете pandas использовать столбецn
для индексации DataFrame. В приведенном выше примере:pd.read_csv('data_file.csv', index_col=0)
Выход:
header1 header2 header3 index 1 str_data 12 1.40 3 str_data 22 42.33 4 str_data 2 3.44 2 str_data 43 43.34 7 str_data 25 23.32
skip_blank_lines
По умолчанию пустые строки пропускаются. Используйтеskip_blank_lines=False
чтобы включить пустые строки (они будут заполнены значениямиNaN
)pd.read_csv('data_file.csv', index_col=0,skip_blank_lines=False)
Выход:
header1 header2 header3 index 1 str_data 12 1.40 3 str_data 22 42.33 4 str_data 2 3.44 2 str_data 43 43.34 NaN NaN NaN NaN 7 str_data 25 23.32
parse_dates
Используйте этот параметр для анализа данных даты.Файл:
date_begin;date_end;header3;header4;header5 1/1/2017;1/10/2017;str_data;1001;123,45 2/1/2017;2/10/2017;str_data;1001;67,89 3/1/2017;3/10/2017;str_data;1001;0
Код для разбора столбцов
0
и1
качестве дат:pd.read_csv('f.csv', sep=';', parse_dates=[0,1])
Выход:
date_begin date_end header3 header4 header5 0 2017-01-01 2017-01-10 str_data 1001 123,45 1 2017-02-01 2017-02-10 str_data 1001 67,89 2 2017-03-01 2017-03-10 str_data 1001 0
По умолчанию выводится формат даты. Если вы хотите указать формат даты, который вы можете использовать, например
dateparse = lambda x: pd.datetime.strptime(x, '%d/%m/%Y') pd.read_csv('f.csv', sep=';',parse_dates=[0,1],date_parser=dateparse)
Выход:
date_begin date_end header3 header4 header5 0 2017-01-01 2017-10-01 str_data 1001 123,45 1 2017-01-02 2017-10-02 str_data 1001 67,89 2 2017-01-03 2017-10-03 str_data 1001 0
Более подробную информацию о параметрах функции можно найти в официальной документации .
Базовая загрузка в файл csv
raw_data = {'first_name': ['John', 'Jane', 'Jim'],
'last_name': ['Doe', 'Smith', 'Jones'],
'department': ['Accounting', 'Sales', 'Engineering'],}
df = pd.DataFrame(raw_data,columns=raw_data.keys())
df.to_csv('data_file.csv')
Синхронизация дат при чтении из csv
Вы можете указать столбец, содержащий даты, поэтому панды будут автоматически анализировать их при чтении из csv
pandas.read_csv('data_file.csv', parse_dates=['date_column'])
Электронная таблица для данных DataFrames
with pd.ExcelFile('path_to_file.xls) as xl: d = {sheet_name: xl.parse(sheet_name) for sheet_name in xl.sheet_names}
Прочтите конкретный лист
pd.read_excel('path_to_file.xls', sheetname='Sheet1')
Существует много вариантов синтаксического анализа для read_excel
(аналогично параметрам read_csv
.
pd.read_excel('path_to_file.xls', sheetname='Sheet1', header=[0, 1, 2], skiprows=3, index_col=0) # etc.
Тестирование read_csv
import pandas as pd
import io
temp=u"""index; header1; header2; header3
1; str_data; 12; 1.4
3; str_data; 22; 42.33
4; str_data; 2; 3.44
2; str_data; 43; 43.34
7; str_data; 25; 23.32"""
#after testing replace io.StringIO(temp) to filename
df = pd.read_csv(io.StringIO(temp),
sep = ';',
index_col = 0,
skip_blank_lines = True)
print (df)
header1 header2 header3
index
1 str_data 12 1.40
3 str_data 22 42.33
4 str_data 2 3.44
2 str_data 43 43.34
7 str_data 25 23.32
Учет списка
Все файлы находятся в папке files
. Сначала создайте список DataFrames, а затем concat
их:
import pandas as pd
import glob
#a.csv
#a,b
#1,2
#5,8
#b.csv
#a,b
#9,6
#6,4
#c.csv
#a,b
#4,3
#7,0
files = glob.glob('files/*.csv')
dfs = [pd.read_csv(fp) for fp in files]
#duplicated index inherited from each Dataframe
df = pd.concat(dfs)
print (df)
a b
0 1 2
1 5 8
0 9 6
1 6 4
0 4 3
1 7 0
#'reseting' index
df = pd.concat(dfs, ignore_index=True)
print (df)
a b
0 1 2
1 5 8
2 9 6
3 6 4
4 4 3
5 7 0
#concat by columns
df1 = pd.concat(dfs, axis=1)
print (df1)
a b a b a b
0 1 2 9 6 4 3
1 5 8 6 4 7 0
#reset column names
df1 = pd.concat(dfs, axis=1, ignore_index=True)
print (df1)
0 1 2 3 4 5
0 1 2 9 6 4 3
1 5 8 6 4 7 0
Читайте в кусках
import pandas as pd
chunksize = [n]
for chunk in pd.read_csv(filename, chunksize=chunksize):
process(chunk)
delete(chunk)
Сохранить в CSV-файле
Сохранить с параметрами по умолчанию:
df.to_csv(file_name)
Напишите конкретные столбцы:
df.to_csv(file_name, columns =['col'])
Разделитель Difault - это «,» - изменить его:
df.to_csv(file_name,sep="|")
Запись без заголовка:
df.to_csv(file_name, header=False)
Напишите с заданным заголовком:
df.to_csv(file_name, header = ['A','B','C',...]
Чтобы использовать конкретную кодировку (например, «utf-8»), используйте аргумент кодировки:
df.to_csv (имя_файла, encoding = 'utf-8')
Синхронизация столбцов даты с read_csv
Дата всегда имеет другой формат, они могут быть проанализированы с использованием определенной функции parse_dates.
Этот input.csv :
2016 06 10 20:30:00 foo 2016 07 11 19:45:30 bar 2013 10 12 4:30:00 foo
Может быть проанализирован следующим образом:
mydateparser = lambda x: pd.datetime.strptime(x, "%Y %m %d %H:%M:%S")
df = pd.read_csv("file.csv", sep='\t', names=['date_column', 'other_column'], parse_dates=['date_column'], date_parser=mydateparser)
Параметр parse_dates - это столбец для анализа
date_parser - это функция парсера
Чтение и объединение нескольких файлов CSV (с той же структурой) в один DF
import os
import glob
import pandas as pd
def get_merged_csv(flist, **kwargs):
return pd.concat([pd.read_csv(f, **kwargs) for f in flist], ignore_index=True)
path = 'C:/Users/csvfiles'
fmask = os.path.join(path, '*mask*.csv')
df = get_merged_csv(glob.glob(fmask), index_col=None, usecols=['col1', 'col3'])
print(df.head())
Если вы хотите объединить CSV-файлы по горизонтали (добавление столбцов), используйте функцию axis=1
при вызове функции pd.concat()
:
def merged_csv_horizontally(flist, **kwargs):
return pd.concat([pd.read_csv(f, **kwargs) for f in flist], axis=1)
Чтение cvs-файла в кадре данных pandas, когда нет строки заголовка
Если файл не содержит строку заголовка,
Файл:
1;str_data;12;1.4
3;str_data;22;42.33
4;str_data;2;3.44
2;str_data;43;43.34
7; str_data; 25; 23.32
вы можете использовать names
ключевых слов для предоставления имен столбцов:
df = pandas.read_csv('data_file.csv', sep=';', index_col=0,
skip_blank_lines=True, names=['a', 'b', 'c'])
df
Out:
a b c
1 str_data 12 1.40
3 str_data 22 42.33
4 str_data 2 3.44
2 str_data 43 43.34
7 str_data 25 23.32
Использование HDFStore
import string
import numpy as np
import pandas as pd
генерировать образец DF с различными типами
df = pd.DataFrame({
'int32': np.random.randint(0, 10**6, 10),
'int64': np.random.randint(10**7, 10**9, 10).astype(np.int64)*10,
'float': np.random.rand(10),
'string': np.random.choice([c*10 for c in string.ascii_uppercase], 10),
})
In [71]: df
Out[71]:
float int32 int64 string
0 0.649978 848354 5269162190 DDDDDDDDDD
1 0.346963 490266 6897476700 OOOOOOOOOO
2 0.035069 756373 6711566750 ZZZZZZZZZZ
3 0.066692 957474 9085243570 FFFFFFFFFF
4 0.679182 665894 3750794810 MMMMMMMMMM
5 0.861914 630527 6567684430 TTTTTTTTTT
6 0.697691 825704 8005182860 FFFFFFFFFF
7 0.474501 942131 4099797720 QQQQQQQQQQ
8 0.645817 951055 8065980030 VVVVVVVVVV
9 0.083500 349709 7417288920 EEEEEEEEEE
сделать больше DF (10 * 100.000 = 1.000.000 строк)
df = pd.concat([df] * 10**5, ignore_index=True)
создать (или открыть существующий) файл HDFStore
store = pd.HDFStore('d:/temp/example.h5')
сохраните наш фрейм данных в файл h5
(HDFStore), индексируя столбцы [int32, int64, string]:
store.append('store_key', df, data_columns=['int32','int64','string'])
показать подробности HDFStore
In [78]: store.get_storer('store_key').table
Out[78]:
/store_key/table (Table(10,)) ''
description := {
"index": Int64Col(shape=(), dflt=0, pos=0),
"values_block_0": Float64Col(shape=(1,), dflt=0.0, pos=1),
"int32": Int32Col(shape=(), dflt=0, pos=2),
"int64": Int64Col(shape=(), dflt=0, pos=3),
"string": StringCol(itemsize=10, shape=(), dflt=b'', pos=4)}
byteorder := 'little'
chunkshape := (1724,)
autoindex := True
colindexes := {
"index": Index(6, medium, shuffle, zlib(1)).is_csi=False,
"int32": Index(6, medium, shuffle, zlib(1)).is_csi=False,
"string": Index(6, medium, shuffle, zlib(1)).is_csi=False,
"int64": Index(6, medium, shuffle, zlib(1)).is_csi=False}
показывать индексированные столбцы
In [80]: store.get_storer('store_key').table.colindexes
Out[80]:
{
"int32": Index(6, medium, shuffle, zlib(1)).is_csi=False,
"index": Index(6, medium, shuffle, zlib(1)).is_csi=False,
"string": Index(6, medium, shuffle, zlib(1)).is_csi=False,
"int64": Index(6, medium, shuffle, zlib(1)).is_csi=False}
закрыть (flush to disk) наш файл магазина
store.close()
Чтение журнала доступа Nginx (несколько кавычек)
Для нескольких кавычек используйте regex вместо sep:
df = pd.read_csv(log_file,
sep=r'\s(?=(?:[^"]*"[^"]*")*[^"]*$)(?![^\[]*\])',
engine='python',
usecols=[0, 3, 4, 5, 6, 7, 8],
names=['ip', 'time', 'request', 'status', 'size', 'referer', 'user_agent'],
na_values='-',
header=None
)