【问题标题】:pandas get mean column name and extra string columns熊猫得到平均列名和额外的字符串列
【发布时间】:2017-07-26 23:13:33
【问题描述】:

在熊猫 0.18.1、python 2.7.6 中:

假设我们有下表:

ID,FROM_YEAR,FROM_MONTH,AREA
1,2015,1,200
1,2015,2,200
1,2015,3,200
1,2015,4,200
1,2015,5,200
1,2015,6,200
1,2015,7,200
1,2015,8,200
1,2015,9,200
1,2015,10,200
1,2015,11,200
1,2015,12,200
1,2016,1,100
1,2016,2,100
1,2016,3,100
1,2016,4,100
1,2016,5,100
1,2016,6,100
1,2016,7,100
1,2016,8,100
1,2016,9,100
1,2016,10,100
1,2016,11,100
1,2016,12,100

我们正在尝试获取以下格式的日历年平均值

ID,FROM_YEAR,TYPE,AREA
1,2015,A,200
1,2016,A,100
1,2015,B,200
1,2016,B,100

注意:TYPE 是其他信息的字符串列。这里我们只有 2 种类型的 'TYPE':'A' 和 'B'

如果我们尝试以下操作,则缺少“AREA”列名,ID=1 也仅在第一种情况下显示。

AREA_CY=df.groupby(['ID','FROM_YEAR'])['AREA'].mean()

它返回:

ID,FROM_YEAR,
1,2015,200
,2016,100
,2015,200
,2016,100

如果我们尝试以下方法:

AREA_CY=df.groupby(['ID','FROM_YEAR'])['AREA'].mean(axis=1)

它返回:

TypeError: mean() got an unexpected keyword argument 'axis'

有哪位大师能开导吗?谢谢!

【问题讨论】:

    标签: python-2.7 pandas mean


    【解决方案1】:

    试试这个:

    In [102]: x = df.groupby(['ID','FROM_YEAR'])['AREA'].mean().reset_index(name='AREA')
    
    In [103]: y = pd.DataFrame({'TYPE':['A','B']})
    
    In [104]: x
    Out[104]:
       ID  FROM_YEAR  AREA
    0   1       2015   200
    1   1       2016   100
    
    In [105]: y
    Out[105]:
      TYPE
    0    A
    1    B
    
    In [106]: x.assign(key=0).merge(y.assign(key=0), on='key').drop('key', 1)
    Out[106]:
       ID  FROM_YEAR  AREA TYPE
    0   1       2015   200    A
    1   1       2015   200    B
    2   1       2016   100    A
    3   1       2016   100    B
    

    解释:

    让我们创建一个xy DFs 的cartesian product(AKA 全外连接):

    In [126]: x.assign(key=0)
    Out[126]:
       ID  FROM_YEAR  AREA  key
    0   1       2015   200    0
    1   1       2016   100    0
    
    In [127]: y.assign(key=0)
    Out[127]:
      TYPE  key
    0    A    0
    1    B    0
    
    In [128]: x.assign(key=0).merge(y.assign(key=0), on='key')
    Out[128]:
       ID  FROM_YEAR  AREA  key TYPE
    0   1       2015   200    0    A
    1   1       2015   200    0    B
    2   1       2016   100    0    A
    3   1       2016   100    0    B
    

    【讨论】:

    • 谢谢!你介意简单解释一下这条线吗? x.assign(key=0).merge(y.assign(key=0), on='key').drop('key', 1)
    • 感谢#MaxU 的清晰解释。在开发本主题的代码时,我还遇到了另一个挑战。你可以帮帮我吗? stackoverflow.com/questions/42637395/…
    • 我完全同意!
    猜你喜欢
    • 2015-09-11
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-18
    • 2021-08-30
    • 1970-01-01
    相关资源
    最近更新 更多