2015-06-02 2 views
-1

У меня есть набор данных, где есть матрица числовых значений, индексированных переменной времени. Каждая матрица представляет собой массив numpy (который может быть преобразован в фрейм данных с столбцами, соответствующими столбцам матрицы). если у меня есть эти матрицы, как я могу сделать их в единый файл данных, где каждая матрица имеет индекс времени? а именно:создание мультииндекса в pandas dataframes в Python?

# time t1 
d1 = pandas.DataFrame({"a": [1,2,3,4], "b":[10,20,30,40]}) 
# time t2 
d2 = pandas.DataFrame({"a": [10,20,30,40], "b": [1,2,5,6]}) 
# time t3 
d3 = ... 

я хочу сделать индекс с именем «время» индексировать эти dataframes, а затем агрегированные значения из столбцов «а» и «б» через индекс времени. как вы можете это сделать в пандах?

моя попытка:

d=pandas.DataFrame([d1,d2],index=(0, 1),columns=["time"]) 

обновление: решение unutbu для добавления двух иерархических столбцов:

c = pd.concat([d1, d2], keys=[('t1', 'p1'), ('t2', 'p2')], names=['time', 'position'])

мой последний вопрос, как получить доступ к этой структуре в результате? например, как вы выполняете векторизованные операции через time или через position? например, взять среднее число строк для каждого значения time.

также, как это соотносится с кодировкой time и position в каждом информационном кадре и с использованием groupby? другими словами, когда использовать уровни против плоских столбцов, которые сгруппированы? вот альтернативное решение с использованием плоских dataframe с GroupBy:

d1["time"] = 1 
d1["position"] = "x" 
d2["time"] = 2 
d2["position"] = "y" 
c = pandas.concat([d1, d2]) 
# take mean for all time values 
c.groupby("time").apply(lambda x: np.mean(x, axis=1)) 
+0

@ VidhyaG: имеет смысл обратиться к ответу и подробно остановиться на вопросе. это часто делается – lgd

ответ

1

Учитывая

import pandas as pd 

d1 = pd.DataFrame({"a": [1,2,3,4], "b":[10,20,30,40]}) 
d2 = pd.DataFrame({"a": [10,20,30,40], "b": [1,2,5,6]}) 

затем pd.concat([d1, d2], keys=['t1', 't2']) возвращается:

In [177]: pd.concat([d1, d2], keys=['t1', 't2']) 
Out[177]: 
     a b 
t1 0 1 10 
    1 2 20 
    2 3 30 
    3 4 40 
t2 0 10 1 
    1 20 2 
    2 30 5 
    3 40 6 

Если вы хотите добавить более одного уровня к новый MultiIndex, вы можете вместо этого передать список кортежей параметру keys:

In [237]: pd.concat([d1, d2], keys=[('t1', 'p1'), ('t2', 'p2')], names=['time', 'position']) 
Out[237]: 
        a b 
time position   
t1 p1  0 1 10 
       1 2 20 
       2 3 30 
       3 4 40 
t2 p2  0 10 1 
       1 20 2 
       2 30 5 
       3 40 6 

Обратите внимание, здесь важно, что keys получает список кортежей, а не список списков.

+1

это использует multiindex под капотом? также это не отражает тот факт, что мои индексы упорядочены. t1, t2, являются числовыми и упорядоченными, и словарь теряет это ... – lgd

+0

'pd.concat (..., keys = ...)' возвращает DataFrame с помощью multiindex. Передавая значения времени (числовые или другие) в качестве списка в параметр 'keys', порядок индексов будет сохранен. – unutbu

+0

и как это можно сделать с помощью двух индексов? скажем, я хотел иметь «время», а также «позицию»? это не работает: '' 'pd.concat ([d1, d2], keys = [['t1', 't2'], ['p1', 'p2']], names = [" time "," position "])' '' – lgd

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