2016-10-24 4 views
1

나는 dataframe팬더 : 그 문자열을 포함하는 경우 열에서 일부 값을 대체

member_id,device_type,device_id,event_type,event_path,event_duration 
603609,url,mail.ru/,0,pc,7d4a095373874b4fb26a2e6d070b6ad3 
603609,url,mail.ru/,0,pc,7d4a095373874b4fb26a2e6d070b6ad3 
603609,url,mail.ru/,0,pc,7d4a095373874b4fb26a2e6d070b6ad3 
603609,url,mail.ru/,3,pc,7d4a095373874b4fb26a2e6d070b6ad3 
603609,url,mail.ru/community.livejournal.com/psp_ru,28,pc,7d4a095373874b4fb26a2e6d070b6ad3 
603609,url,lady.mail.ru/article/491411-kurban-omarov-otvetil-na-obvinenija-ksenii-borodinoj/?from=mr_news,0,pc,7d4a095373874b4fb26a2e6d070b6ad3 
603609,url,mail.ru/,0,pc,7d4a095373874b4fb26a2e6d070b6ad3 
603609,url,lady.mail.ru/article/491411-kurban-omarov-otvetil-na-obvinenija-ksenii-borodinoj/?from=mr_news,0,pc,7d4a095373874b4fb26a2e6d070b6ad3 
603609,url,lady.mail.ru/article/491411-kurban-omarov-otvetil-na-obvinenija-ksenii-borodinoj/?from=mr_news,0,pc,7d4a095373874b4fb26a2e6d070b6ad3 

하고 난 다른 파일에서 하위 문자열 검색하고 pattrn이 포함 된 경우, find.xlsx

url category category2 
falloutsite.ru/ Рубрики/Hi-Tech/Программы/Софт/Игры/ Рубрики/Hi-Tech/Программы/Софт/Игры/ 
kmzpub.ru/games.asp Рубрики/Hi-Tech/Программы/Софт/Игры/Универсальное/ Рубрики/Hi-Tech/Программы/Софт/Игры/Универсальное/ 
sigma-team.ru/content/view/15/19 Рубрики/Hi-Tech/Программы/Софт/Игры/Quake и Counter-Strike/  Рубрики/Hi-Tech/Программы/Софт/Игры/Quake и Counter-Strike/ 
community.livejournal.com/psp_ru Рубрики/Развлечения/Игры/Приставочные игры/  Рубрики/Развлечения/Игры/Приставочные игры/ 
에서 열 category을 만들어야합니다

나는에 그것을 대체 할

df = pd.read_csv('car owners games_category.csv') 
find = pd.read_excel('blue.xlsx') 
d = find.set_index('url')['category'].to_dict() 
df['category'] = df.device_id.apply(lambda x: pd.Series([v for k,v in d.items() if k in x])) 

를 사용 카테고리이지만, ValueError: Wrong number of items passed 2, placement implies 1을 반환합니다. mapisin을 사용해 보려하지만 일반 문자열이 필요합니다.

+0

데이터 작성에 시간을 할애 해 주시겠습니까 [clipbo 친절한] (http://stackoverflow.com/questions/20109391/how-to-make-good-reproducible-pandas-examples)? – Ivan

답변

1

오랜 시간 동안 실제 데이터를 테스트 한 결과 행 13이 아닌 목록 이해력 2 범주에서 문제 Series이 발생했습니다.

df['category'] = df.device_id 
        .apply(lambda x: pd.Series([v for k,v in d.items() if k in x]).iloc[0]) 

을 또 다른 해결책은 drop하여이 행을 제거 할 수 있습니다 : :

find.drop(13, inplace=True) 

시험의 모든 문제 행 :

하나 개 추적 할 수없는 가망 솔루션은 Series에서 수익에만 첫 번째 항목에 대한 iloc[0]을 사용하는 것입니다

#custom function return list to column 'category' 
def f(x): 
    return [v for k,v in d.items() if k in x] 
df['category'] = df.device_id.apply(f) 
print (df) 

#filter all rows where length of list is not 1 
print (df[df.category.apply(len) != 1]) 

#return length of problematic rows 
print (df.ix[df.category.apply(len) != 1, 'category'].apply(len)) 
관련 문제