2015-09-29 2 views
2

У меня есть таблица Excel с данными, хранящимися следующим образом.Таблица Excel в упорядоченную рамку данных панд

enter image description here

Я хотел бы организовать эти данные в dataframe панды так, что он выглядит следующим образом ...

enter image description here

Имея данные, отформатированные как это позволит мне легко работать со сводными таблицами и проводить анализ.

Если есть отличный способ сделать это, пожалуйста, дайте мне знать. Python был бы лучшим выбором, так как у меня есть сотни таблиц, подобных этому, с сотнями строк и столбцов.

ответ

1

Вот как я мог бы решить проблему с Python, хотя может быть более элегантное решение.

Сначала я хотел бы разобрать значения месяц/год с использованием openpyxl

from openpyxl import load_workbook 

wb = load_workbook('data_so.xlsx') 
sheet_ranges = wb['Sheet1'] 

year = str(sheet_ranges['A1'].value) 
month = str(sheet_ranges['B1'].value) 

Оттуда я найти пакет панд чрезвычайно полезным для типов манипуляций вы требуете, Установка мультииндексы позволяют легко перепрофилирования (через стек).

import pandas as pd 
df = pd.read_excel('data_so.xlsx', skiprows=3) 

columns = pd.MultiIndex.from_tuples([('A', 'Price'), ('A', 'Quantity'), 
            ('B', 'Price'), ('B', 'Quantity'), 
            ('C', 'Price'), ('C', 'Quantity')], 
            names=['letters', 'index']) 

index = pd.MultiIndex.from_arrays(df.ix[:,:2].values.T,names=('Item', 'Code')) 
df2 = pd.DataFrame(df.ix[:,2:].values, columns=columns, index=index) 
df3 = df2.stack('letters').reset_index() 

Затем мы можем установить месяц и год к значениям, которые мы собрали:

df3['Year'] = year 
df3['Month'] = month 

Output d3

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

df3.index = pd.MultiIndex.from_arrays(df3[['Item','Code','letters','Year','Month']].values.T, 
             names=('Item', 'Code','letters','Year','Month')) 
df4 = df3[['Price','Quantity']].stack() 
df5 = pd.DataFrame(df4) 
df5.columns = ['Value'] 
df5.reset_index() 

df5 ouput

+0

спасибо! оно работает :) –

Смежные вопросы