2016-11-28 2 views
1

'MovieName'및 'Actors'라는 두 개의 열이있는 데이터 프레임 df가 있습니다. 모양은 다음과 같습니다.다른 CSV 파일을 기반으로 계산합니다.

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

다른 배우 이름은 '*'로 구분됩니다. gender.csv라는 다른 CSV 파일이 있는데,이 파일에는 첫 번째 이름을 기반으로하는 모든 액터의 성별이 있습니다. 내 dataframe에서 'female_actors'각각 특정 영화에서 여성과 남성 배우의 수를 포함 'male_actors을'두 개의 열을 추가 할

ActorName Gender 
Tom   male 
Emily  female 
Christopher male 

- 같은 gender.csv 보인다.

팬더에서 df와 gender.csv를 모두 사용하여이 작업을 수행하려면 어떻게해야합니까?

있다는 점 유의 하시길 바랍니다 - 특정 이름이 gender.csv에 존재하지

  1. 경우, 총을 계산에 포함되지 않습니다.
  2. 영화에 단 하나의 액터가 있고 gender.csv에 액터가 없으면 카운트는 0이어야합니다. 위의 예제의

결과이어야한다 -

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

관련 문제