2016-12-18 45 views
1

AFER接合兩個數據幀:Python的熊貓數據幀:組行和減少基團與自定義函數

left_dict = {                     
    'id1': [1,2,3,4,5],                   
    'val1': [10,20,30,40,50],                 
    'lft': ['a','b','c','d','e']                
}                        

right_dict = {                     
    'id1': [1,7,3,4,8,1,3],                  
    'val2': [100,700,300,400,800,110,330],              
    'rgt': [1.1,2.2,3.3,4.4,5.5,6.6,7.7]              
}                        

left = pd.DataFrame(left_dict)                 
right = pd.DataFrame(right_dict)                

r = pd.merge(left, right, how='outer', on='id1', indicator=False) 

我得到產生的數據幀:

id1 lft val1 rgt val2                 
0 1.0 a 10.0 1.1 100.0                 
1 1.0 a 10.0 6.6 110.0                 
2 2.0 b 20.0 NaN NaN                 
3 3.0 c 30.0 3.3 300.0                 
4 3.0 c 30.0 7.7 330.0                 
5 4.0 d 40.0 4.4 400.0                 
6 5.0 e 50.0 NaN NaN                 
7 7.0 NaN NaN 2.2 700.0                 
8 8.0 NaN NaN 5.5 800.0                 

現在我需要摺疊具有相同的行'id1','lft'和'rgt'與'id1','lft','rgt'保持一行,並且在這個數據框中添加一個新的列'xxx'。在此列「XXX」值計算與函數

def f(val1, val2): 
    if math.isnan(val2): 
     r = val1 
    else: 
     if math.isnan(val1): 
      r = val2 
    else: 
     r = val1 * 2 + val2 * 3 
    return r 

所以得出的數據幀應該是這樣的:

id1 lft val1 rgt val2 xxx                
0 1.0 a 10.0 1.1 100.0 320.0                
1 2.0 b 20.0 NaN NaN 20.0                
2 3.0 c 30.0 3.3 300.0 960.0                
3 4.0 d 40.0 4.4 400.0 40.0                
4 5.0 e 50.0 NaN NaN 50.0                
5 7.0 NaN NaN 2.2 700.0 700.0                
6 8.0 NaN NaN 5.5 800.0 800.0                

我試圖用:

In [85]: r.groupby(['id1','val1', 'lft', 'rgt']).groups 

這將返回一個字典的值等於組中的行號,這根本沒有任何幫助。任何想法如何實際摺疊和減少行?

+2

當「摺疊」行時,如果'id1'對於多行是相同的,那麼如何在最終數據框中選擇'rgt'和'val1'的值? – Peaceful

+0

你是對的,我錯過了這部分。現在我已經用「 」糾正了我的問題現在我需要用'id1','lft','rgt'將相同的'id1','lft'和'rgt'摺疊成一行,並且添加一個新的列'xxx'到這個數據幀。這個'xxx'列中的值是通過函數「 – zork

+0

」來計算的。「摺疊行」是什麼意思? – josh

回答

0
r['xxx'] = [f(x[1]['val1'],x[1]['val2']) for x in r.iterrows()] 

可能會工作,但請記住,對於重複的組合,您將得到重複的行,是您正在尋找的邏輯?