2016-12-18 11 views
1

Afer соединения двух кадров данных:Python Панда Dataframe: группа строки и уменьшающие группы с пользовательской функцией

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 в этот фрейм данных. Значения в этой колонке «ххх» вычисляются с помощью функции

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

В то время как «складывание» строк, как вы выбираете значения 'rgt' и' val1' в последнем фрейме данных, если 'id1' одинаково для нескольких строк? – Peaceful

+0

Вы правы, я пропустил эту часть. Теперь я исправил свою проблему с помощью « Теперь мне нужно свернуть строки с одинаковыми« id1 »,« lft »и« rgt »в одну строку с« id1 »,« lft »,« rgt », без изменений и добавить новую столбец «xxx» в этот кадр данных. Значения в этом столбце «xxx» вычисляются с помощью функции « – zork

+0

Что вы подразумеваете под словом« fold rows »? – josh

ответ

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

вероятно будет работать, но иметь в виду, что для дублированных комбинаций вы получите дублированные строки, является то, что логика вы ищете?