2015-07-09 4 views
1

Я действительно трудное время погружения в панд:Панды добавить строки dataframe с двумя индексами

здесь я хотел бы создать DataFrame такого рода с двойным индексом: i1 и i2:

cols = ["i1", "i2", "d1", "d2", "d3"] 
T = pd.DataFrame(columns=cols).set_index(["i1", "i2"]) 

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

до сих пор я пытался:

T.loc[ 1,2 ] = pd.Series({"d1":10, "d2":20, "d3":30}) 

, а также:

T.append(pd.Series({"d1":10, "d2":20, "d3":30}, name=(1,2))) 

ни один из которых дает желаемый результат.

+0

Какую версию панд вы используете? Второй вариант работает для меня (с 0.16.2). – joris

+0

Вы должны проверить [docs] (http://pandas.pydata.org/pandas-docs/stable/advanced.html#using-slicers) и, в частности, почему вам нужен синтаксис в ответ Joris 'T.loc [ (1,2) ,:] ', чтобы устранить ваше намерение, в какой-то степени вызов' (axis = 0) 'является другим подходом – EdChum

ответ

1

Для первой попытки следующие работы:

In [258]: 
T.loc(axis=0)[ (1,2) ] = pd.Series({"d1":10, "d2":20, "d3":30}) 
T 

Out[258]: 
     d1 d2 d3 
i1 i2    
1 2 10 20 30 

Это T.append(pd.Series({"d1":10, "d2":20, "d3":30}, name=(1,2))) также отлично работает в панд 0.16.2

+0

append не меняет мой T в моей версии 0.16.1 – Magellan88

+0

Я предлагаю обновить, если вы можете – EdChum

1

Первый вариант работает, если вы делаете T.loc[(1,2),:] вместо T.loc[ 1,2 ] (так панды знает два значения как для индекса строки (для уровней индекса двух строк):

In [63]: T = pd.DataFrame(columns=cols).set_index(["i1", "i2"]) 

In [64]: T.loc[(1,2),: ] = pd.Series({"d1":10, "d2":20, "d3":30}) 

In [65]: T 
Out[65]: 
     d1 d2 d3 
i1 i2 
1 2 10 20 30 

Более подробное объяснение: T.loc[ 1,2 ] попытается получить доступ к строкам 1 и столбцу 2. Поэтому вам необходимо передать (1,2) в качестве кортежа и явно выбрать все столбцы с :, давая .loc[(1,2),:].

Второй раз работает для меня (с пандами 0.16.2): ​​

In [68]: T = pd.DataFrame(columns=cols).set_index(["i1", "i2"]) 

In [69]: T.append(pd.Series({"d1":10, "d2":20, "d3":30}, name=(1,2))) 
Out[69]: 
     d1 d2 d3 
i1 i2 
1 2 10 20 30 

Но следует помнить, что добавление значения в обоих этих отношениях всегда будет взять копию существующего кадра.
Возможно, вам лучше пересмотреть свой подход и сделать данные с данными одновременно (но, конечно, это зависит от вашего приложения).