Я хочу отметить некоторые квантили в своих данных, и для каждой строки DataFrame я хотел бы, чтобы запись в новом столбце называлась, например. "xtile" для хранения этого значения.
Например, предположим, что я создаю фрейм данных следующим образом:
import pandas, numpy as np
dfrm = pandas.DataFrame({'A':np.random.rand(100),
'B':(50+np.random.randn(100)),
'C':np.random.randint(low=0, high=3, size=(100,))})
И допустим, я пишу свою собственную функцию для вычисления квинтиля каждого элемента в массиве. У меня есть для этого своя функция, но, например, просто обратитесь к scipy.stats.mstats.mquantile.
import scipy.stats as st
def mark_quintiles(x, breakpoints):
# Assume this is filled in, using st.mstats.mquantiles.
# This returns an array the same shape as x, with an integer for which
# breakpoint-bucket that entry of x falls into.
Теперь реальный вопрос заключается в том, как использовать transform
для добавления нового столбца к данным. Что-то вроде этого:
def transformXtiles(dataFrame, inputColumnName, newColumnName, breaks):
dataFrame[newColumnName] = mark_quintiles(dataFrame[inputColumnName].values,
breaks)
return dataFrame
А потом:
dfrm.groupby("C").transform(lambda x: transformXtiles(x, "A", "A_xtile", [0.2, 0.4, 0.6, 0.8, 1.0]))
Проблема в том, что приведенный выше код не добавит новый столбец «A_xtile». Он просто возвращает мой фрейм данных без изменений. Если я сначала добавлю столбец, полный фиктивных значений, таких как NaN, с именем "A_xtile", то он действительно успешно перезапишет этот столбец, чтобы включить правильные отметки квинтиля.
Но крайне неудобно сначала писать в графу о чем-то подобном, что я, возможно, захочу добавить на лету.
Обратите внимание, что простой apply
здесь не сработает, поскольку он не будет знать, как разобраться в массивах результатов, возможно, разного размера для каждой группы.