Панды применяют функцию, которая возвращает больше строк

1

У меня есть датафрейм с несколькими столбцами, некоторые из которых являются списками. Я хотел бы применить функцию к каждой строке, которая по существу расширяет каждую строку на n строк (n изменений для каждой строки) после некоторых манипуляций с данными в списках.

Упрощенную версию этого можно увидеть здесь:

df = pd.DataFrame({'id':[0,1],'value':[[0,1,2],[3,4]]}).set_index('id')

def func(x):
    v = np.array(x['value'])
    return pd.Series([v,v**2],index=['value','value_2'])

Мой желаемый результат:

    id  value   value_2
0   0   0   0
1   0   1   1
2   0   2   4
3   1   3   9
4   1   4   16

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

df.apply(func,axis=1)

    value   value_2
id      
0   [0, 1, 2]   [0, 1, 4]
1   [3, 4]  [9, 16]

Есть ли способ получить желаемый результат без изменения формы после применения функции?

  • 0
    Всегда ли value и value_2 имеют одинаковое измерение? если 3-я строка имеет 7 элементов по value , значит ли это, что 3-я строка из value_2 имеет 7 элементов?
  • 0
    да. они всегда имеют одинаковое измерение.
Теги:
pandas

2 ответа

1

Вы можете unnest потом использовать векторизованные операции:

u = unnest(df.reset_index(), ['id'], ['value'])
u.assign(value_2=u.value**2)

   id  value  value_2
0   0      0       0
1   0      1       1
2   0      2       4
3   1      3       9
4   1      4      16
0

Другой возможный ответ - использование pd.Series + stack

df = df.value.apply(pd.Series).stack().reset_index(level=0).rename(columns={0:'value'}).set_index('id')
df.apply(func,axis=1)
print(df)
        value   value_2
    id       
    0   0.0     0.0
    0   1.0     1.0
    0   2.0     4.0
    1   3.0     9.0
    1   4.0     16.0

Ещё вопросы

Сообщество Overcoder
Наверх
Меню