У меня есть датафрейм с несколькими столбцами, некоторые из которых являются списками. Я хотел бы применить функцию к каждой строке, которая по существу расширяет каждую строку на 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]
Есть ли способ получить желаемый результат без изменения формы после применения функции?
Вы можете 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
Другой возможный ответ - использование 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
value
иvalue_2
имеют одинаковое измерение? если 3-я строка имеет 7 элементов поvalue
, значит ли это, что 3-я строка изvalue_2
имеет 7 элементов?