【发布时间】:2012-09-05 13:48:08
【问题描述】:
我想在我的数据中标记一些分位数,对于 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 在这里不起作用,因为它不知道如何理解每个组可能大小不同的结果数组。
【问题讨论】:
-
没有。请参阅 Pandas 库。
-
这和我刚要问的问题出奇的一样!奇怪!
标签: python group-by transform dataframe pandas