2014-10-03 80 views
0

我有一個數據框,其中行有一個名稱,一個類型和一個SLA列。 SLA列是一個數字值:1,2或3.SLA列專用於輸入,而不是名稱。新Pandas Groupby API更改

我有創建一個新列的代碼,它按名稱值進行分組,併爲所有具有相同名稱的行強制使用相同的數值。即如果給定名稱的所有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,該功能後休息。但是,我無法弄清楚爲什麼。有誰知道爲什麼熊貓中的新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

你會發佈一個完整的起始幀,什麼版本你開啓以及更改了哪個版本。 API向後兼容。所以不知道什麼是'破' – Jeff 2014-10-03 20:10:50

+0

將更新與所有這些信息的問題。恭敬地說,這個函數連續成功運行了幾百天,然後在更新熊貓時立即停止運行。 – humbug 2014-10-03 20:12:17

+0

編輯名稱以擺脫'破'的語言,不要試圖污染圖書館,使我的工作成爲可能。 – humbug 2014-10-03 20:30:32

回答

0

您應該開關h使用內置的pandas,然後將其與原始幀合併。嘗試使用此代碼...

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

編輯

取決於你想要什麼你_Norm價值,你也可以使用.apply(function)

+0

這是完美的..沒有.astype(int)。謝謝。 – humbug 2014-10-03 20:43:36

+1

我認爲正常的操作是對groupby執行'transform'操作,以便返回一個對象,其索引與原始df對齊:http://pandas.pydata.org/pandas-docs/stable/groupby。 html#transformation – EdChum 2014-10-03 20:46:03

+0

任何想法爲什麼上面的函數將停止工作? – humbug 2014-10-03 20:49:52