операции на базе данных mutliindex - PullRequest
0 голосов
/ 29 октября 2018

Я хотел бы добавить столбцы в мультииндексный фрейм данных Pandas, который будет содержать результат операции, выполненной над другими столбцами.

У меня есть датафрейм, похожий на этот:

first   bar     baz     
second  one two one two
A       5   2   9   2   
B       6   4   7   6   
C       5   4   5   1   

Теперь для каждой группы в кадре данных я хотел бы добавить столбец «три», который равен столбцу «один» минус столбец «два»:

first   bar             baz     
second  one two three   one two three
A       5   2   3       9   2   7
B       6   4   2       7   6   1
C       5   4   1       5   1   4

На самом деле мой фрейм данных намного больше. Я изо всех сил пытаюсь найти ответ на этот (надеюсь) простой вопрос. Любые предложения приветствуются.

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Используйте DataFrame.xs для выбора one и two уровней и вычитания, затем создайте MultiIndex в столбце с помощью MultiIndex.from_product:

df1 = df.xs('one', axis=1, level=1) - df.xs('two', axis=1, level=1)
df1.columns = pd.MultiIndex.from_product([df1.columns, ['three']])
print (df1)
    bar   baz
  three three
A     3     7
B     2     1
C     1     4

Затем concat к оригиналу и для заказа изменений используйте reindex помощником MultiIndex:

mux = pd.MultiIndex.from_product([['bar','baz'], ['one','two','three']], 
                                  names=df.columns.names)
df = pd.concat([df, df1], axis=1).reindex(columns=mux)
print (df)
first  bar           baz          
second one two three one two three
A        5   2     3   9   2     7
B        6   4     2   7   6     1
C        5   4     1   5   1     4
0 голосов
/ 29 октября 2018

Создайте свое приложение df, используя MultiIndex

s=pd.DataFrame([[1,2],[2,3],[3,4]],columns=pd.MultiIndex.from_arrays([['bar','baz'],['three','three']]))
s
Out[458]: 
    bar   baz
  three three
0     1     2
1     2     3
2     3     4

Тогда мы делаем concat

yourdf=pd.concat([df,s],axis=1).sort_index(level=0,axis=1)

Если порядок имеет значение, вы можете reindex или можете рассмотреть факторизованный уровень.

...