2016-11-28 69 views
1

我有一個數據框df與兩列稱爲'MovieName'和'演員'。它看起來像:基於其他csv文件計數

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

請注意,不同的演員姓名由'*'分隔。我有另一個名爲gender.csv的csv文件,它具有基於名字的所有參與者的性別。 gender.csv樣子 -

ActorName Gender 
Tom   male 
Emily  female 
Christopher male 

我想在我的數據幀添加兩列「female_actors」和「male_actors」分別包含女性和男性行爲者在特定影片的數量。

如何在熊貓中同時使用df和gender.csv來完成此任務?

請注意 -

  1. 如果特定的名字沒有出現在gender.csv,不要總指望它。
  2. 如果電影中只有一個演員,並且在gender.csv中不存在,那麼它的計數應爲零。

結果上述例子應該是 -

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

回答

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 

輸出

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

尼斯。我們是否可以從功能中同時返回男性和女性的數量並將其存儲爲一行? – MYGz

+0

@qmaruf它會引發錯誤。 AttributeError:'float'對象沒有屬性'split'是否因爲有一些NaN值? – ComplexData

+0

@Dreamer我這麼認爲。你應該適當地處理數據。 – qmaruf