Pandas — очень мощный инструмент для работы и манипуляций над данными с помощью python. Можно сказать, что pandas предоставляет возможности SQL базы данных, дополненные мощью python. Однако, работа с данной библиотекой иногда вызывает некоторые трудности, так как работать приходится по сути с матричными данными и объектами pandas да numpy, а переход к стандартным python типам и циклам неминуемо грозит кратной потерей функциональности. Поэтому для себя создал шпаргалку по работе с дата-фреймами:
Работа начинается с загрузки данных в DataFrame, поэтому для начала считаем данные:
df = pd.read_csv('some.csv') # если Вам заранее известны типы, то чрезвычайно полезно задать типы колонок сразу - это сэкономит оперативную память. # также можно использоть лишь несколько колонок, а не все колонки в файле df = pd.read_csv('some.csv', usecols=["user_id", "id3"], dtype={"user_id": np.int64, "id3": np.uint16})
Возможно и самостоятельно создать DataFrame и добавить строки
# пример создания объекта дата-фрейм pd.DataFrame(columns=['A', 'B']) # пример добавления строки в дата-фрейм df.append({'A':1, 'B':2}, ignore_index=True)
После создания или загрузки DF полезно посмотреть чтоже там за данные, для этого можно воспользоваться следующими операциями:
df.head() # первые строки df.tail() # последние строки df.sample(5) # случайно выбранное кол-ва строк, полезно использовать для уменьшения матрицы для прогонки тестов df.shape # по аналогии с numpy - размерность матрицы df.describe() # математические данные df.info() # использование памяти
Возможно далее вам захочется получить точечное значение по координатам из дата фрема, тогда используйте ix
some_value = df.ix[2, 'som_col'] # похожие функции loc и iloc
Для фильтрации по колонкам пандас использует булевую логику, проще показать на примере:
filtered_data = df[df.some_col == 'apple'] filtered_data = df[(df.price > 10.0) & (df.some_col == 'apple')]
Далее приведём несколько примеров манипуляции с данными:
# пример удаления колонки: df = df.drop("A", axis=1) # удалит дубликаты df = df.drop_duplicates() # Создание новой колонки со значением по умолчанию df['new_col'] = 1 # а вот так можно добавлять колонку с условием df['new_col2'] = np.where(df['score']>=10.0, True, False)
Применение произвольной функции ко всей колонке
def get_score(s): return s * 0.21 df['score'] = df.some_col.apply(get_score)
Переименование колонки, сортировка
# переименовываем колонку A на колонку C df = df.rename(columns={'A': 'C'}) # сортировка по одной колонке df = df.sort_values('price', axis=0, ascending=False) # сортировка сразу по нескольким колонкам df = df.sort_values(['price', 'score'], ascending=[1, 0])
пример на соединение или конкатенацию дата-фреймов
df = pd.concat([df1, df2], ignore_index=True, axis=0)
группировка в дата-фрейме без мультииндекса
df.groupby(['A'], as_index=False).agg({'B': lambda series: series.iloc[0]})
После всех манипуляций, вас скорее всего надо будет данные куда-то выгрузить в другом формате или сохранить до следующего раза новый фрагмент таблицы дата-фрейма:
# в numpy массив df.values # в numpy массив, но сразу всю матрицу df.as_matrix # сохранить в файл df.to_csv('submission.csv', index=False)