2016-11-28 82 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