2017-10-16 7 views
1

Je suis un débutant pandas et j'ai besoin d'aide.Pandas combinant la même ligne dans une nouvelle colonne tout en préservant la ligne (pas un simple group-by)

je le dataframe de pandas géants suivants:

ID   Val-A Val-B 

aab12  lower -30 
dbc11  lower -10 
aab12  upper 50 
dbc11  upper 20 

Je veux produire une nouvelle trame de données du précédent et ne peut pas penser à une façon de le faire:

ID   Val-A Val-B upper-lower 
aab12  lower -30 80 
aab12  upper 50  80 
dbc11  lower -10 30 
dbc11  upper 20  30 

Toute aide sera très apprécié!

Répondre

1

Je pense que vous avez besoin sort_values d'abord avec reset_index Nice index monotones unique et puis transform avec abs et sum:

df = df.sort_values('ID').reset_index(drop=True) 
df['upper-lower'] = df['Val-B'].abs().groupby(df['ID']).transform(sum) 

print (df) 
     ID val-A Val-B upper-lower 
0 aab12 lower -30   80 
1 aab12 upper  50   80 
2 dbc11 lower -10   30 
3 dbc11 upper  20   30 
+0

Si elle est de 50, 30, (pas négatif) :-) – Wen

+0

J'ai besoin de travailler avec des négatifs, c'est pourquoi j'ai donné cet exemple exact ... – Tom

+0

@Tom - Est-ce possible d'utiliser 'abs'? – jezrael

0

En supposant que vous avez deux nombres positifs:

df['upper-lower']=df.groupby('ID')['Val-B'].apply(lambda x : x.diff().abs().bfill()) 
df.sort_values('ID') 
Out[394]: 
     ID Val-A Val-B upper-lower 
0 aab12 lower -30   80.0 
2 aab12 upper  50   80.0 
1 dbc11 lower -10   30.0 
3 dbc11 upper  20   30.0