创建由 Groupby 和转换产生的数据框列
Posted
技术标签:
【中文标题】创建由 Groupby 和转换产生的数据框列【英文标题】:Creating a dataframe column resulting from Groupby and transform 【发布时间】:2019-09-03 20:48:24 【问题描述】:我有一个包含 4 列 textID、A、B、C 的数据框
我想创建一个 groupby 对象,然后计算 C 列的第 5 个百分位数,然后将此列(称为“分位数”)添加回原始数据框。
当 groupby 在一列上时,我有以下代码可以工作
df2['quantile']=df2.C.groupby(df2.itextID).transform(lambda x:
x.quantile(q=0.5))
问题 1: 如何扩展它以便 groupby 对象现在使用两列,即 textID 和 A?
问题 2: 可以先创建 groupby 对象,然后再应用变换吗? 即
### Create groupby object Extract top 4 rows in each group
grp = df2.groupby('textID').head(4)
??? how to apply the transform to column C?
谢谢
(可以使用方括号表示法而不是点吗?)
【问题讨论】:
【参考方案1】:在groupby
内的列表中使用替代列名,并指定groupby
之后的列以处理transform
或其他函数:
df2['quantile']= (df2.groupby(['itextID', 'A'])['C']
.transform(lambda x: x.quantile(q=0.5)))
这里grp
是DataFrame,不是groupby
对象,因为GroupBy.head
返回DataFrame
:
grp = df2.groupby('textID').head(4)
但是可以通过删除.head(4)
来创建groupby
对象:
grp = df2.groupby('textID')
然后使用head
:
df = grp.head(4)
或transform
:
df2['new'] = grp['C'].transform(lambda x: x.quantile(q=0.5))
【讨论】:
谢谢,你将如何将 head 和 transform 结合起来,将它们链接起来? @user11305439 有点问题,因为head
过滤,表示应用后行数较少。函数transform
工作方式不同,没有过滤。所以链接在一起是像df1 = df2.groupby('textID').head(4). transform(function)
这样的问题。所以需要先过滤df3 = df2.groupby('textID').head(4)
,然后通过df3['new'] = df3.groupby('textID')['C'].transform(lambda x: x.quantile(q=0.5))
创建新列以上是关于创建由 Groupby 和转换产生的数据框列的主要内容,如果未能解决你的问题,请参考以下文章
如何在 df.groupby 之后将数据框列值作为窗口大小传递?