2016-11-28 3 views
1

Ich habe ein Dataframe df mit zwei Spalten namens "MovieName" und "Actors". Es sieht so aus:Count basierend auf anderen csv-Datei

MovieName Actors 
lights out Maria Bello 
legend  Tom Hardy*Emily Browning*Christopher Eccleston*David Thewlis 

Bitte beachten Sie, dass verschiedene Schauspieler Namen durch '*' getrennt sind. Ich habe eine andere CSV-Datei namens gender.csv, die das Geschlecht aller Akteure auf der Grundlage ihrer Vornamen hat. gender.csv sieht aus wie -

ActorName Gender 
Tom   male 
Emily  female 
Christopher male 

ich zwei Spalten in meiner Datenrahmen hinzufügen möchten ‚female_actors‘ und ‚male_actors‘, die in diesem bestimmten Film bzw. die Anzahl der weiblichen und männlichen Schauspieler enthält.

Wie erreiche ich diese Aufgabe mit beiden df und gender.csv in Pandas?

Bitte beachten Sie, dass -

  1. Wenn bestimmte Namen nicht in gender.csv ist, kann es nicht in der Gesamt zählen.
  2. Wenn nur ein Akteur in einem Film vorhanden ist und in gender.csv nicht vorhanden ist, sollte die Zählung null sein.

Ergebnis obigen Beispiel sein sollte -

MovieName Actors  male_actors female_actors 
lights out Maria Bello 0    0 
legend  Tom Hardy*Emily Browning*Christopher Eccleston*David Thewlis 2 1 

Antwort

3
import pandas as pd 

df1 = pd.DataFrame({'MovieName': ['lights out', 'legend'], 'Actors':['Maria Bello', 'Tom Hardy*Emily Browning*Christopher Eccleston*David Thewlis']}) 
df2 = pd.DataFrame({'ActorName': ['Tom', 'Emily', 'Christopher'], 'Gender':['male', 'female', 'male']}) 


def func(actors, gender): 
    actors = [act.split()[0] for act in actors.split('*')]  
    n_gender = df2.Gender[df2.Gender==gender][df2.ActorName.isin(actors)].count() 
    return n_gender 

df1['male_actors'] = df1.Actors.apply(lambda x: func(x, 'male')) 
df1['female_actors'] = df1.Actors.apply(lambda x: func(x, 'female')) 

df1.to_csv('res.csv', index=False) 
print df1 

Ausgabe

Actors,MovieName,male_actors,female_actors 
Maria Bello,lights out,0,0 
Tom Hardy*Emily Browning*Christopher Eccleston*David Thewlis,legend,2,1 
+0

Nizza. Können wir männlich und weiblich gleichzeitig von der Funktion zurückgeben und sie als Reihe speichern? – MYGz

+0

@qmaruf Es wird ein Fehler ausgegeben. AttributeError: 'float' -Objekt hat kein Attribut 'split'. Liegt es daran, dass einige NaN-Werte vorhanden sind? – ComplexData

+0

@Dreamer Ich denke schon. Sie sollten Daten entsprechend verarbeiten. – qmaruf

Verwandte Themen