【问题标题】:Creating a dataframe column resulting from Groupby and transform创建由 Groupby 和转换产生的数据框列
【发布时间】: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?

谢谢

(可以使用方括号表示法而不是点吗?)

【问题讨论】:

    标签: pandas group-by transform


    【解决方案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))创建新列
    猜你喜欢
    • 2020-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-07
    • 2020-08-16
    • 1970-01-01
    • 2018-12-08
    相关资源
    最近更新 更多