Панды нарезки данных с помощью MultiIndex - PullRequest
0 голосов
/ 11 мая 2018

У меня есть некоторые функции, которые я хочу записать в некоторые CSV-файлы.Я хочу использовать панд для этого подхода, если это возможно.
Я следую инструкции в здесь и создал несколько фиктивных данных, чтобы проверить это.В основном есть некоторые действия со случайным количеством принадлежащих им функций.

import io
data = io.StringIO('''Activity,id,value,value,value,value,value,value,value,value,value
Run,1,1,2,2,5,6,4,3,2,1
Run,1,2,4,4,10,12,8,6,4,2
Stand,2,1.5,3.,3.,7.5,9.,6.,4.5,3.,1.5
Sit,3,0.5,1.,1.,2.5,3.,2.,1.5,1.,0.5
Sit,3,0.6,1.2,1.2,3.,3.6,2.4,1.8,1.2,0.6
Run, 2, 0.8, 1.6, 1.6, 4. , 4.8, 3.2, 2.4, 1.6, 0.8
''')
df_unindexed = pd.read_csv(data)
df = df_unindexed.set_index(['Activity', 'id'])

Когда я запускаю:

df.xs('Run')

, я получаю

    value  value.1  value.2  value.3  value.4  value.5  value.6  value.7  \
id                                                                         
1     1.0      2.0      2.0      5.0      6.0      4.0      3.0      2.0   
1     2.0      4.0      4.0     10.0     12.0      8.0      6.0      4.0   
2     0.8      1.6      1.6      4.0      4.8      3.2      2.4      1.6   
    value.8  
id           
1       1.0  
1       2.0  
2       0.8 

, который почтичто я хочу, это все run деятельность.Я хочу удалить 1-ую строку и 1-й столбец, т.е. заголовок и столбец id.Как мне этого добиться?

Также второй вопрос: когда мне нужно только одно действие, как мне его получить.
При использовании

idx = pd.IndexSlice
df.loc[idx['Run', 1], :]

дает

             value  value.1  value.2  value.3  value.4  value.5  value.6  \
Activity id                                                                
Run      1     1.0      2.0      2.0      5.0      6.0      4.0      3.0   
         1     2.0      4.0      4.0     10.0     12.0      8.0      6.0   
             value.7  value.8  
Activity id                    
Run      1       2.0      1.0  
         1       4.0      2.0  

но нарезка не работает так, как я ожидал.Например, попытка

df.loc[idx['Run', 1], 2:11]

вместо этого приводит к ошибке:

TypeError: невозможно выполнить индексирование среза с этими индексаторами [2] из 'int'>

Итак, как мне получить свои функции в этом месте?

PS Если не ясно, я новичок в Pandas, так что будьте осторожны.Кроме того, столбец id можно редактировать, чтобы он был уникальным для каждого вида деятельности или для всего набора данных, если это облегчает задачу и т. Д.

Ответы [ 3 ]

0 голосов
/ 11 мая 2018

Вы можете использовать небольшой взлом - получить имена столбцов по позициям, потому что iloc для MultiIndex еще не поддерживается :

print (df.columns[2:11])
Index(['value.2', 'value.3', 'value.4', 'value.5', 'value.6', 'value.7',
       'value.8'],
      dtype='object')

idx = pd.IndexSlice
print (df.loc[idx['Run', 1], df.columns[2:11]])
             value.2  value.3  value.4  value.5  value.6  value.7  value.8
Activity id                                                               
Run      1       2.0      5.0      6.0      4.0      3.0      2.0      1.0
         1       4.0     10.0     12.0      8.0      6.0      4.0      2.0

Если хотите сохранить файл в csv без индекса и столбцов:

df.xs('Run').to_csv(file, index=False, header=None)
0 голосов
/ 11 мая 2018

Избегайте проблемы, распознавая столбцы индекса во время чтения CSV:

pd.read_csv(header=0, # to read in the header row as a header row, and 
... index_col=['id'] or index_col=0 to pick the index column.
0 голосов
/ 11 мая 2018

Я в основном смотрю на https://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-integer, когда застреваю в подобных проблемах.

Без какого-либо тестирования, я думаю, вы можете удалить строки и столбцы, такие как

df = df.drop(['rowindex'], axis=0)
df = df.drop(['colname'], axis=1)
...