我有一个数据框,其中行包含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
答案 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)