创建由 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 和转换产生的数据框列的主要内容,如果未能解决你的问题,请参考以下文章

groupby之后的熊猫数据框列[重复]

如何在 df.groupby 之后将数据框列值作为窗口大小传递?

将 groupby 平均统计数据映射为 pandas 中的新列

将列表转换为pyspark中的数据框列

熊猫数据框列的分组和计数

如何使用 Spark 数据框列上的函数或方法使用 Scala 进行转换