【问题标题】:How to transform the result of a Pandas `GROUPBY` function to the original dataframe如何将 Pandas `GROUPBY` 函数的结果转换为原始数据框
【发布时间】:2018-11-16 02:58:43
【问题描述】:

假设我有一个包含 6 列的 Pandas DataFrame 和一个自定义函数,该函数对 2 或 3 列中的元素进行计数并生成布尔输出。当从原始数据框创建groupby 对象并应用自定义函数df.groupby('col1').apply(myfunc) 时,结果是一个长度等于col1 的类别数的系列。如何扩展此输出以匹配原始数据帧的长度?我尝试了transform,但无法使用自定义函数myfunc

编辑:

这是一个示例代码:

A = pd.DataFrame({'X':['a','b','c','a','c'], 'Y':['at','bt','ct','at','ct'], 'Z':['q','q','r','r','s']})
print (A)

def myfunc(df):
    return ((df['Z'].nunique()>=2) and (df['Y'].nunique()<2))

A.groupby('X').apply(myfunc)

我想将此输出扩展为新列 Result,这样在 X 列中有 a 的地方,Result 将是 True

【问题讨论】:

  • 你能给我们看一些你的代码吗?
  • @user7374610,我只是添加了一个简单的示例代码。

标签: python pandas dataframe


【解决方案1】:

你可以mapgroupby 回到原来的dataframe

A['Result'] = A['X'].map(A.groupby('X').apply(myfunc))

结果如下:

    X   Y   Z   Result
0   a   at  q   True
1   b   bt  q   False
2   c   ct  r   True
3   a   at  r   True
4   c   ct  s   True

【讨论】:

    【解决方案2】:

    我的解决方案可能不是最好的,它使用循环,但我认为它非常好。

    核心思想是您可以通过for i, gdf in gp 遍历所有子数据帧(gdf)。然后为每个子数据框添加列result(在我的示例中为c)。最后将所有子数据框合并为一个。

    这是一个例子:

    import pandas as pd
    df = pd.DataFrame({'a':[1,2,1,2],'b':['a','b','c','d']})
    gp = df.groupby('a')  # group
    s = gp.apply(sum)['a'] # apply a func
    adf = []
    
    # then create a new dataframe
    for i, gdf in gp:
        tdf = gdf.copy()
        tdf.loc[:,'c'] = s.loc[i]
        adf.append(tdf)
    pd.concat(adf)
    

    来自:

        a   b
    0   1   a
    1   2   b
    2   1   c
    3   2   d
    

    到:

        a   b   c
    0   1   a   2
    2   1   c   2
    1   2   b   4
    3   2   d   4
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-23
      • 2017-11-22
      • 2019-04-01
      • 2020-11-27
      • 2018-01-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多