Я хочу отметить некоторые кванты в моих данных, и для каждой строки 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
здесь не будет работать, так как он не будет знать, как понять возможности массивов результатов по-разному для каждой группы.