панды получают наиболее частые имена из столбца, в котором есть список имен - PullRequest
0 голосов
/ 12 декабря 2018

мой фрейм данных выглядит следующим образом

star_rating  actors_list
0   9.3     [u'Tim Robbins', u'Morgan Freeman']
1   9.2     [u'Marlon Brando', u'Al Pacino', u'James Caan']
2   9.1     [u'Al Pacino', u'Robert De Niro']
3   9.0     [u'Christian Bale', u'Heath Ledger']
4   8.9     [u'John Travolta', u'Uma Thurman']

Я хочу извлечь наиболее часто встречающиеся имена в столбце актеров_списка.Я нашел этот код.у вас есть лучшее предложение?особенно для больших данных.

import pandas as pd
df= pd.read_table (r'https://raw.githubusercontent.com/justmarkham/pandas-videos/master/data/imdb_1000.csv',sep=',')
df.actors_list.str.replace("(u\'|[\[\]]|\')",'').str.lower().str.split(',',expand=True).stack().value_counts()

ожидаемый результат для ( этих данных )

robert de niro    13
tom hanks         12
clint eastwood    11
johnny depp       10
al pacino         10
james stewart      9

Ответы [ 4 ]

0 голосов
/ 13 декабря 2018

в соответствии с этот код Я получил ниже диаграммы

enter image description here, который

  • код coldspeed равен wen2 ()
  • Код Дарк wen4 ()
  • Код шахты wen1 ()
  • Код WB wen3 ()
0 голосов
/ 12 декабря 2018

Всегда лучше перейти на простой питон, чем в зависимости от панд, так как он занимает огромное количество памяти, если список большой.

Если список имеет размер 1000, то списки, не имеющие длины 1000, будут иметь Нэн при использовании expand = True, что является пустой тратой памяти.Попробуйте это вместо этого.

df = pd.concat([df]*1000) # For the sake of large df. 

%%timeit
df.actors_list.str.replace("(u\'|[\[\]]|\')",'').str.lower().str.split(',',expand=True).stack().value_counts()
10 loops, best of 3: 65.9 ms per loop

%%timeit     
df['actors_list'] = df['actors_list'].str.strip('[]').str.replace(', ',',').str.split(',')
10 loops, best of 3: 24.1 ms per loop

%%timeit
words = {}
for i in df['actors_list']:
    for w in i : 
        if w in words:
            words[w]+=1
        else:
            words[w]=1

100 loops, best of 3: 5.44 ms per loop
0 голосов
/ 12 декабря 2018

Я буду использовать ast для преобразования списка в list

import ast 
df.actors_list=df.actors_list.apply(ast.literal_eval)
pd.DataFrame(df.actors_list.tolist()).melt().value.value_counts()
0 голосов
/ 12 декабря 2018

По моим тестам было бы намного быстрее выполнить очистку регулярных выражений после подсчета.

from itertools import chain
import re

p = re.compile("""^u['"](.*)['"]$""")
ser = pd.Series(list(chain.from_iterable(
    x.title().split(', ') for x in df.actors_list.str[1:-1]))).value_counts()
ser.index = [p.sub(r"\1", x) for x in ser.index.tolist()]


ser.head()

Robert De Niro    18
Brad Pitt         14
Clint Eastwood    14
Tom Hanks         14
Al Pacino         13
dtype: int64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...