2017-02-08 6 views
1

Когда я использую apply для функции, заданной пользователем в Pandas, похоже, что python создает дополнительный массив. Как я могу избавиться от него? Вот мой код:Почему есть дополнительный индекс при использовании в Pandas

def fnc(group): 
    x = group.C.values 
    out = x[np.where(x < 0)] 
    return pd.DataFrame(out) 

data = pd.DataFrame({'A':np.random.randint(1, 3, 10), 
        'B':3, 
        'C':np.random.normal(0, 1, 10)}) 

data.groupby(by=['A', 'B']).apply(fnc).reset_index() 

Существует этот странный Level_2 индекс создан. Есть ли способ избежать его создания при выполнении моей функции?

A B level_2 0 
0 1 3 0  -1.054134802 
1 1 3 1  -0.691996447 
2 2 3 0  -1.068693768 
3 2 3 1  -0.080342046 
4 2 3 2  -0.181869799 
+0

Вы после: 'data [data.C <0]'? – MaxU

+0

Что вы пытаетесь достичь. Это не очевидно, и почему вы возвращаете DataFrame в 'fnc'? –

+1

Как вы оцениваете результат и почему вы делаете группу в первую очередь? –

ответ

2

Таким образом, у вас не будет никакого способа избежать появления уровня_2. Это связано с тем, что результат вашей группировки - это кадр данных с несколькими элементами в нем: pandas достаточно крут, чтобы понять, что ваше желание состоит в том, чтобы транслировать эти элементы по сгруппированным клавишам, но он принимает индекс кадра данных как дополнительный уровень, чтобы гарантировать когерентные выходные данные. Таким образом, явный отказ от уровня = -1 в конце обработки.

Если вы хотите избежать сброса этого дополнительного индекса, но по-прежнему иметь некоторую пост-обработку, другим способом было бы преобразовать вызов вместо применения, и получить возвращаемые данные из fnc, являющегося целым групповым вектором, в который вы положили np.nan для результаты исключить. Тогда ваша датафрейма не будет иметь дополнительного уровня, но вам нужно будет позвонить по телефону dropna().

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

  • Нет связанных вопросов^_^