2017-06-26 6 views
0

J'ai extrait des données au format pandas à partir d'un serveur sql. La structure comme ceci:Pandas: substitution par lots de valeurs de différentes lignes répondant aux mêmes critères

df = pd.DataFrame({'Day':(1,2,3,4,1,2,3,4),'State':('A','A','A','A','B','B','B','B'),'Direction':('N','S','N','S','N','S','N','S'),'values':(12,34,22,37,14,16,23,43)}) 

>>> df 
    Day Direction State values 
0 1   N  A  12 
1 2   S  A  34 
2 3   N  A  22 
3 4   S  A  37 
4 1   N  B  14 
5 2   S  B  16 
6 3   N  B  23 
7 4   S  B  43 

Maintenant, je veux remplacer toutes les valeurs avec le même jour et même direction, mais avec (Etat == A) par lui-même + les valeurs de même jour et même État, mais avec (Etat == B). Par exemple, comme ceci:

df.loc[(df.Day == 1) & (df.Direction == 'N') & (df.State == 'A'),'values'] = df.loc[(df.Day == 1) & (df.Direction == 'N') & (df.State == 'A'),'values'].values + df.loc[(df.Day == 1) & (df.Direction == 'N') & (df.State == 'B'),'values'].values 

>>> df 
    Day Direction State values 
0 1   N  A  26 
1 2   S  A  34 
2 3   N  A  22 
3 4   S  A  37 
4 1   N  B  14 
5 2   S  B  16 
6 3   N  B  23 
7 4   S  B  43 

Notez les premières valeurs de ligne ont été modifiées de 12 à 26 (12 + 14) Puisque les valeurs sont de différentes lignes, donc un peu difficile à utiliser des fonctions combine_first?

Maintenant, je dois utiliser deux boucles (sur 'Day' et sur 'Direction') et la phrase d'attribution ci-dessus à faire, c'est extrêmement lent quand la dataframe devient grande. Avez-vous un moyen intelligent et efficace de le faire?

Répondre

1

Vous pouvez d'abord définir une fonction pour ajouter des valeurs de B à A dans le même groupe. Ensuite, appliquez cette fonction à chaque groupe.

def f(x): 
    x.loc[x.State=='A','values']+=x.loc[x.State=='B','values'].iloc[0] 
    return x 

df.groupby(['Day','Direction']).apply(f) 
Out[94]: 
    Day Direction State values 
0 1   N  A  26 
1 2   S  A  50 
2 3   N  A  45 
3 4   S  A  80 
4 1   N  B  14 
5 2   S  B  16 
6 3   N  B  23 
7 4   S  B  43 
+0

oh, groupez et appliquez: charmant compagnon de funcs. En tant que débutant, soyez toujours impressionné par ce qu'ils peuvent faire, mais ils ont quand même besoin de plus de formation pour les maîtriser. Merci beaucoup, mec – lkonweb

+0

Pas de soucis. Veuillez accepter la réponse si vous le trouvez utile. – Allen