2016-06-04 3 views
1

Erstens habe ich 2 Datenrahmen einer, in dem ich den Namen eines Kerls und Seiten von ihm in Spalten gemocht habe. Also nein. von Spalten wird für verschiedene Personen hier unterschiedlich sein, ist das Beispiel. 1. Spalte ist der Name des Benutzers. Dann Seiten von ihm gemocht wird über die Zeile gespeichert.So nein. Spalten für "Random Guy" wird sich von "Mank Rion" unterscheiden. 'BlackBick', '500 Startups' e.t.c sind der Name der Seite. sagen sie mal Name dieses Datenrahmens User_page istNehmen Sie zwei und mehr Datenrahmen und Extrahieren von Daten über eindeutige Schlüssel in Python

random guy  BlackBuck   GiveMeSport Analytics Ninja 
mank nion  DJ CHETAS   Celina Jaitly Gurkeerat Singh 
pop rajuel  WOW Editions   500 Startups Biswapati Sarkar 
Roshan ghai  MensXP    No Abuse  the smartian 

Jetzt habe ich einen anderen Datenrahmen, in der Art von gleichen wie oben ein, sondern an der Stelle der Name Seite gibt es eine Kategorie von page.you ist vielleicht jetzt gibt es verschiedene Kategorien von Seiten auf fb. also sagen wir "BlacBuck" ist die Kategorie "Transport/Fracht". Es gibt Seiten mit dem gleichen Namen und einer anderen Kategorie. Deshalb kann ich den Namen nicht direkt als Schlüssel benutzen. So sieht mein Datenrahmen aus. Sagen wir den Namen dieses Datenrahmens User_category.

random guy  Transport/Freight Sport  Insurance Company 
mank nion  Arts/Entertainment Actress Actor/Director 
pop rajuel  Concert Tour   App Page Actor/Director 
Roshan ghai  News/Media Website Community Public Figure 

Jetzt habe ich zwei weitere Datenrahmen. eine, in der ich fb Seiten als erste Spalte und 162 weitere Spalten mit einem Tag für jede Seite habe, gibt es den Wert 1 für i * j Element wenn ith Seite in jth Tag kommt sonst leer gelassen, so wird es aussehen. sagen wir Name dieses Datenrahmens ist Pagetag

der andere haben Namen der Kategorien als 1. Spalte und gleiche 162 wie weiter. so was. Nehmen wir an, der Name dieses Datenrahmens lautet Category_tag.

category_name    tag 1  tag2  tag3 
    Sport          1   1 
    App Page      1      1 
    Actor/Director    1           
    Public Figure       1    1 

Nun, was ich habe, um das Tag zu erhalten zählt für jeden Benutzer von Seiten, die er mochte. Dazu muss ich zuerst überprüfen, ob die Seite, die er mag, im Datenrahmen von "Seite_tag" vorhanden ist. Dies ist der dritte Datenrahmen in meiner Frage, wenn dort die Anzahl der Tags vorhanden ist, wie oft ein bestimmter Tag für diesen Benutzer erschienen ist. Dies ist der erste Schritt, wenn der Name der Seite nicht als Nr. gefunden wird. Die Anzahl der Seiten im Pagetag-Datenrahmen (3.) ist begrenzt. Ich gehe zur Kategorie der Seite (vom 2. Datenrahmen in dieser Frage) für die Seiten, die weggelassen werden, und für diese Kategorie zähle ich die Markierungszählung für den spezifischen Benutzer vom Datenrahmen mit dem Namen Category_tags (4. Datenrahmen in dieser Frage) und addiere die Summe Tag-Anzahl und meine Ausgabe etwa so. Output

username    tag1     tag2   tag3 
random guy    1      2    2 
mank nion    2      1    3 
pop rajuel    4      0    2 
Roshan ghai    0      2    1 

a i * j Element auf diesem Datenrahmen zeigt nicht. Mal, dass das j-te Tag für den i-ten Benutzer erscheint. Ich habe Code dafür geschrieben und mehr in R Ich stecke in diesem speziellen Schritt fest. Der Code von R war nicht optimal, da ich viele Schleifen verwendete. Ich wollte rhiz optimal, hoffentlich kann man das in pandas machen.

Dies ist der Code, den ich bisher geschrieben habe. Aber ich denke, es kann effizienter durchgeführt werden PS: aktuelle Nr. Benutzer und Spalte sind sehr groß.

from io import StringIO 
import pandas as pd 
import numpy as np 
# DATA FRAME IMPORT AND MELT 
data1 = u''' 
random guy,BlackBuck,GiveMeSport,Analytics Ninja 
mank nion,DJ CHETAS,Celina Jaitly,Gurkeerat Singh 
pop rajuel,WOW Editions,500 Startups,Biswapati Sarkar 
Roshan ghai,MensXP,No Abuse,the smartian 
''' 

## reading and melting the datasheet of user name and page_liked 
df1 = pd.read_csv(StringIO(data1), sep=",", header=None) 

df1 = pd.melt(df1, id_vars=[0], value_vars=[1,2,3])[[0,'value']] 
df1.columns = ['user', 'page_name'] 

data2 = u''' 
random guy,Transport/Freight,Sport,Insurance Company 
mank nion,Arts/Entertainment,Actress,Actor/Director 
pop rajuel,Concert Tour,App Page,Actor/Director 
Roshan ghai,News/Media Website,Community,Public Figure 
''' 


#reading and melting the data sheet of user name and category of page liked 
df2 = pd.read_csv(StringIO(data2), sep=",", header=None) 
df2 = pd.melt(df2, id_vars=[0], value_vars=[1,2,3])[[0,'value']] 
df2.columns = ['user', 'categories'] 




data3 = u''' 
page_name,tag1,tag2,tag3 
BlackBuck,1,1,0    
GiveMeSport,1,0,1 
Gurkeerat Singh,1,0,1 
DJ CHETAS,0,1,1 
''' 

##reading the meta data of page_name and tag 
df3 = pd.read_csv(StringIO(data3), sep=",") 

data4 = u''' 
category,tag1,tag2,tag3 
Sport,0,1,1 
App Page,1,0,1 
Actor/Director,1,0,0           
Public Figure,0,1,1 
''' 
df4 = pd.read_csv(StringIO(data4), sep=",") 

##reading the data of category and tag 

##adding a column ctegory in df1 based on index 
category = df2['categories'] 
df1['category'] = category 


##creating a list of page which i have in meta_data 
meta_list = list(df3.iloc[:,0]) 

## creating two empty dataframes with column name as same as df1 
new_df1=pd.DataFrame(columns=['user','page_name','category']) 
new_df2=pd.DataFrame(columns=['user','page_name','category']) 

#checking if page in meta list if it is there add that row in newdf1 else  in newdf2 
for i in range(len(df1)): 
    if df1.iloc[i,1] in meta_list: 
     x = df1.iloc[i] 
     new_df1 = new_df1.append(x, ignore_index=True) 
    else: 
     y = df1.iloc[i] 
     new_df2 = new_df2.append(y, ignore_index=True) 


## merging newdf1 and newdf2 on page_name and category repectively 

mdf1 = pd.merge(new_df1, df3, how= 'left', on = ['page_name']) 

mdf2 = pd.merge(new_df2, df4, how= 'left', on=['category']) 
## concatenating the 2 data frame mdf1 and mdf2 and summing the tags for  each of them 
finaldf = pd.concat([mdf1[['user', 'tag1', 'tag2', 'tag3']].groupby(['user']).agg(sum), 
       mdf2[['user', 'tag1', 'tag2', 'tag3']].groupby(['user']).agg(sum)]).reset_index() 

    ## finally grouping on user and summing the tags for each user 
    finaldf1 = finaldf.groupby(['user']).agg(sum).reset_index() 
+0

"Also keine Spalten werden für verschiedene Personen hier ist das Beispiel." reorganisiert Ihre Datenrahmen eine Option? Jemand könnte das vielleicht durchlesen, aber ich denke, dass Sie mit einem vernünftigeren Datenmodell besser dran wären. –

+0

@RobertRodkey kann ich kann den Datenrahmen so transversieren. Nein.der Spalte wird anders sein, aber wie genau wird das mein Problem lösen? –

Antwort

0

Vielen Dank für Ihren Code. Jetzt ist es klarer.

Ich versuche optimalisieren Loops und ich glaube, Sie lieber isin mit any für mask mit boolean indexing verwenden können. Auch ich vereinfache Code in concat:

##adding a column category in df1 based on index 
df1['category'] = df2['categories'] 

##creating a list of page which i have in meta_data 
meta_list = list(df3.iloc[:,0]) 

mask = df1.isin(meta_list).any(1) 
new_df1 = (df1[mask]) 
new_df2 = (df1[~mask]) 

## merging newdf1 and newdf2 on page_name and category repectively 
mdf1 = pd.merge(new_df1, df3, how= 'left', on ='page_name') 
mdf2 = pd.merge(new_df2, df4, how= 'left', on='category') 
## concatenating the 2 data frame mdf1 and mdf2 and summing the tags for  each of them 
finaldf = pd.concat([mdf1,mdf2]) 
## finally grouping on user and summing the tags for each user 
finaldf1 = finaldf.groupby('user', as_index=False).sum() 
print (finaldf1) 
      user tag1 tag2 tag3 
0 Roshan ghai 0.0 1.0 1.0 
1 mank nion 1.0 1.0 2.0 
2 pop rajuel 2.0 0.0 1.0 
3 random guy 2.0 1.0 1.0 
Verwandte Themen