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