【问题标题】:Python Pandas add column to multi-index GroupBy DataFramePython Pandas 将列添加到多索引 GroupBy DataFrame
【发布时间】:2017-05-17 04:53:50
【问题描述】:

我正在尝试向具有多索引的 Pandas GroupBy DataFrame 添加一列。该列是分组后公共键的最大值和平均值之间的差异。

这是输入数据帧:

   Main  Reads  Test  Subgroup
0     1      5    54         1
1     2      2    55         1
2     1     10    56         2
3     2     20    57         3
4     1      7    58         3

代码如下:

import numpy as np
import pandas as pd

df = pd.DataFrame({'Main': [1, 2, 1, 2, 1], 'Reads': [5, 2, 10, 20, 7],\
                   'Test':range(54,59), 'Subgroup':[1,1,2,3,3]})

result = df.groupby(['Main','Subgroup']).agg({'Reads':[np.max,np.mean]})

这是result在计算diff之前的变量:

              Reads     
               amax mean
Main Subgroup           
1    1            5    5
     2           10   10
     3            7    7
2    1            2    2
     3           20   20

接下来,我计算diff 列:

result['Reads']['diff'] = result['Reads']['amax'] - result['Reads']['mean']

但这里是输出:

/home/userd/test.py:9: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/
...stable/indexing.html#indexing-view-versus-copy
...result['Reads']['diff'] = result['Reads']['amax'] - result['Reads']['mean']

我希望diff 列与amaxmean 处于同一级别。

有没有办法将一列添加到 Pandas 中多索引 GroupBy() 对象的最内(底部)列索引?

【问题讨论】:

    标签: python pandas dataframe group-by


    【解决方案1】:

    您可以使用元组访问多索引

    result[('Reads','diff')] = result[('Reads','amax')] - result[('Reads','mean')]
    

    你得到

                        Reads
                        amax    mean    diff
    Main    Subgroup            
    1       1           5       5       0
            2          10      10       0
            3           7       7       0
    2       1           2       2       0
            3          20      20       0
    

    【讨论】:

    • 太棒了!
    【解决方案2】:
    #you can you lambda to build diff directly.
    df.groupby(['Main','Subgroup']).agg({'Reads':[np.max,np.mean,lambda x: np.max(x)-np.mean(x)]}).rename(columns={'<lambda>':'diff'})
    Out[2360]: 
                  Reads          
                   amax mean diff
    Main Subgroup                
    1    1            5    5    0
         2           10   10    0
         3            7    7    0
    2    1            2    2    0
         3           20   20    0
    

    【讨论】:

    • 谢谢!这很有帮助。
    • 您能解释一下嵌入的list 中的lambda 吗?我不确定我理解为什么它需要在那里。
    • lambda 只是您应用于“读取”的另一个函数,就像您放在那里的 np.max 和 np.mean 函数一样。这意味着 dict 中的所有函数都将应用于“Reads”,从而创建 3 个单独的列。
    • 不错的解决方案,非常简单!
    • 谢谢。这对我最有用。
    【解决方案3】:

    试试这个:

    In [8]: result = df.groupby(['Main','Subgroup']).agg({'Reads':[np.max,np.mean, lambda x: x.max()-x.mean()]})
    
    In [9]: result
    Out[9]:
                  Reads
                   amax mean <lambda>
    Main Subgroup
    1    1            5    5        0
         2           10   10        0
         3            7    7        0
    2    1            2    2        0
         3           20   20        0
    
    In [10]: result = result.rename(columns={'<lambda>':'diff'})
    
    In [11]: result
    Out[11]:
                  Reads
                   amax mean diff
    Main Subgroup
    1    1            5    5    0
         2           10   10    0
         3            7    7    0
    2    1            2    2    0
         3           20   20    0
    

    【讨论】:

    • 照常加一:)
    猜你喜欢
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 2018-02-28
    • 2019-01-26
    • 1970-01-01
    • 2016-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多