2017-02-01 4 views
2

Я хотел бы, чтобы сгладить иерархическую мультииндексный к плоскому ИндексуКак сгладить MultiIndex методом/выражением в Pandas?

Теоретически, сопоставляя df1.columns делает рабочие места, однако мне интересно, есть ли способ вызова с использованием лямбды для делать это ?! Это сделало бы более приятным программирование труб.

import numpy as np 
import pandas as pd 

df = pd.DataFrame(np.random.normal(size=(10,2)), columns=list("ab")) 
df1 = (df 
     .rolling(2) 
     .agg(["min", "max"]) 
    ) 
df1.columns = df1.columns.map("{0[0]}_{0[1]}".format) 
df1 

Могу ли я заменить столбцы в вызове метода с лямбда - следовательно, внутри большой скобкой (но что-то лучше, чем функции Python с pipe, хотя)?

+0

Я думаю, что примеры ваших данных будет идти долгий путь. Если вы просто хотите, чтобы индекс использовался как tupels, вы можете сделать 'pd.Index (my_multiindex)' –

+0

Вышеприведенный пример в основном является полным. Но вместо запуска отдельного назначения 'df1.columns = ...', я хотел бы добавить вызов метода внутри 'd1 = (...)', чтобы иметь чистый конвейер. Результат - это то, что я хочу. – Gerenuk

+0

@ Gerenuk, AFAIK в настоящее время это невозможно. Было бы возможно, если 'DataFrame.rename (columns = lambda x: print (x))' будет работать с кортежами для многоуровневых столбцов, но, к сожалению, это не так. – MaxU

ответ

2
df.rolling(2).agg(["min", "max"]).T.apply(
    lambda x: 
     x.append(pd.Series(dict(new='_'.join(x.name)))), 
    1).set_index('new').rename_axis(None).T 

enter image description here

+0

Я думаю, что мы не можем использовать 'df1.columns', поскольку он еще не существует, если мы говорим о« конвейерном »подходе ... – MaxU

+0

@MaxU это правда – piRSquared

+0

@MaxU tell мне, что ты об этом думаешь. Это по-прежнему неприятно, на мой взгляд, – piRSquared

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