新的Pandas Groupby API更改

时间:2014-10-03 20:07:29

标签: python pandas

我有一个数据框,其中行包含Name,Type和SLA列。 SLA列是一个数值:1,2或3. SLA列特定于类型,而不是名称。

我有代码创建一个新列,该列按名称值进行分组,并对具有相同名称的所有行强制执行相同的数值。即如果给定名称的所有SLA值都是2,那么它们都得到2.如果它们都是3,那么它们得到3.否则(如果值混合,所有值都是2或更多),它们都得到2。

df['SLA_Norm'] = df.groupby('Name').apply(assignSLA)

使用功能:

def assignSLA(df):
    a = pd.Series(df['SLA'], df.index)
    m = a.mean()
    if m == 1.0:
        n = [1]
        n = n*len(a)
        return pd.Series(n, df.index)
    elif m == 3.0:
        n = [3]
        n = n*len(a)
        return pd.Series(n, df.index)
    else:
        n = [2]
        n = n*len(a)
        return pd.Series(n, df.index)

更新最近更新了groupby api的pandas库后,此函数会中断。但是,我无法弄清楚为什么。有谁知道为什么pandas中的新groupby功能会破坏这个功能?

非常感谢。

编辑:

首先从df开始:

Name    Type    SLA
Foo     A       1       
Foo     B       2       
Foo     C       3       
Buzz    A       1       
Buzz    A       1       
Buzz    A       1       
Buzz    A       1       
Buzz    A       1       
Bar     C       3       
Bar     C       3       
Bar     C       3   

我曾经得到过,大熊猫13.0:

Name    Type    SLA     SLA_Norm
Foo     A       1       2
Foo     B       2       2
Foo     C       3       2
Buzz    A       1       1
Buzz    A       1       1
Buzz    A       1       1
Buzz    A       1       1
Buzz    A       1       1
Bar     C       3       3
Bar     C       3       3
Bar     C       3       3  

现在我得到了,大熊猫14.0:

Name    Type    SLA     SLA_Norm
Foo     A       1       NaN
Foo     B       2       NaN
Foo     C       3       NaN
Buzz    A       1       NaN
Buzz    A       1       NaN
Buzz    A       1       NaN
Buzz    A       1       NaN
Buzz    A       1       NaN
Bar     C       3       NaN
Bar     C       3       NaN
Bar     C       3       NaN

1 个答案:

答案 0 :(得分:0)

您应切换到使用内置组合的pandas,然后将其与原始框架合并。尝试使用此代码...

means = df.groupby('Name')[['SLA']].mean()
df = pd.merge(df,means,left_on='Name',right_index=True,suffixes=("","_Norm"))

修改

根据您对_Norm值的要求,您也可以使用.apply(function)