2016-08-23 12 views
1

Ich habe etwas Code geschrieben, um die IDs von zwei Datenrahmen abzubilden, und wenn eine Bedingung übereinstimmt, dann eine Zählung in einer angegebenen Spalte im vorhandenen Datenrahmen zu erstellen, suche ich nach einem effizienteren Art der Berechnung.Pandas, Karte zwei Datenrahmen, Zählung basiert auf Bedingung

Beispieldaten

import numpy as np 
import pandas as pd 
d = {'ID' : pd.Series([111, 222, 111, 444, 222, 111]), 'Tag' : pd.Series([1, 2, 3, 1, 2, 1])} 
df1 = (pd.DataFrame(d)) 
print(df1) 

    ID Tag 
0 111 1 
1 222 2 
2 111 3 
3 444 1 
4 222 2 
5 111 1 

d = {'ID' : pd.Series([111, 444, 666, 444, 777])} 
df2 = (pd.DataFrame(d)) 
print(df2)  
    ID 
0 111 
1 444 
2 666 
3 444 
4 777 

df2['tag1'] = 0 
df2['tag2'] = 0 
df2['tag3'] = 0 
​ 
for index, row in df2.iterrows(): 
    for i, t in df1.iterrows(): 
     if row['ID'] == t['ID']: 
      if t['Tag'] == 1: 
       df2.loc[index]["tag1"] += 1 
      elif t['Tag'] == 2: 
       df2.loc[index]["tag2"] += 1 
      elif t['Tag'] == 3: 
       df2.loc[index]["tag3"] += 1 

Ausgabe

print(df2) 
    ID tag1 tag2 tag3 
0 111  2  0  1 
1 444  1  0  0 
2 666  0  0  0 
3 444  1  0  0 
4 777  0  0  0 

Was ist der effizienteste Weg, dies zu tun, anstatt iterativ Berechnung?

Hinweis kann df1 enthält die Probe ID mehrere Male mit einem anderen Wert von Tag

(DF1 und DF2 sind große Datenrahmen, mit 50.000 Zeilen in DF1 und 15.000 in DF2)

Antwort

1

Sie können crosstab verwenden mit merge:

print (pd.crosstab(df1.ID, df1.Tag)) 
Tag 1 2 3 
ID   
111 2 0 1 
222 0 2 0 
444 1 0 0 

print (pd.merge(df2, pd.crosstab(df1.ID, df1.Tag) 
         .add_prefix('tag') 
         .reset_index(), on='ID', how='left') 
     .fillna(0) 
     .astype(int)) 

    ID tag1 tag2 tag3 
0 111  2  0  1 
1 444  1  0  0 
2 666  0  0  0 
3 444  1  0  0 
4 777  0  0  0 

Statt crosstab können Sie groupby mit size und 01.230.832 verwenden:

print (df1.groupby(['ID', 'Tag'])['Tag'].size().unstack()) 
Tag 1 2 3 
ID     
111 2.0 NaN 1.0 
222 NaN 2.0 NaN 
444 1.0 NaN NaN 

print (pd.merge(df2, df1.groupby(['ID', 'Tag'])['Tag'].size().unstack() 
         .add_prefix('tag') 
         .reset_index(), on='ID', how='left') 
     .fillna(0) 
     .astype(int)) 

    ID tag1 tag2 tag3 
0 111  2  0  1 
1 444  1  0  0 
2 666  0  0  0 
3 444  1  0  0 
4 777  0  0  0 
+0

Dank für eine schnelle Antwort @jezrael – user3939059

+0

Gut, dass Sie helfen können, viel Glück! – jezrael

Verwandte Themen