l oop до Pandas DF и добавление значений в список, который является значением словаря, где условное значение является ключом - PullRequest
0 голосов
/ 27 апреля 2020

Очень сложно сделать короткий, но описательный заголовок для этого, но у меня есть датафрейм, где каждая строка соответствует строке персонажа, а весь корпус представляет собой весь сериал. Я хочу создать словарь, в котором ключи - это список верхних символов, l oop через DF и добавить каждую строку диалога к значению их ключей, которое я хочу получить в виде списка

У меня есть столбец с именем 'Символ' и столбец с именем 'диалог':

Character      dialogue
PICARD         'You will agree Data that Starfleets
               order are...'
DATA           'Difficult? Simply solve the mystery of 
               Farpoint Station.'
PICARD         'As simple as that.'
TROI           'Farpoint Station. Even the name sounds
                mysterious.'

И так далее, и так далее ... Есть много второстепенных символов, поэтому я просто хочу, чтобы первые 10 символов были по количеству диалогов, поэтому у меня есть список из них называются major_chars. Я хочу окончательный словарь, где каждый символ является ключом, а значение - огромный список всех их строк. Я не знаю, как добавить в пустой список, установленный в качестве значения для каждого ключа. На данный момент мой код:

char_corpuses = {} 
for label, row in df.iterrows():
    for char in main_chars:
        if row['Character'] == char:
            char_corpuses[char] = [row['dialogue']]

Но конечный результат - это только последняя строка, которую каждый персонаж говорит в корпусе:

{'PICARD': [' so five card stud nothing wild and the skys the limit'],
 'DATA': [' would you care to deal sir'],
 'TROI': [' you were always welcome'],
 'WORF': [' agreed'],
 'Q': [' youll find out in any case ill be watching and if youre very lucky ill drop by to say hello from time to time see you out there'],
 'RIKER': [' of course have a seat'],
 'WESLEY': [' i will bye mom'],
 'CRUSHER': [' you know i was thinking about what the captain told us about the future about how we all changed and drifted apart why would he want to tell us whats to come'],
 'LAFORGE': [' sure goes against everything weve heard about not polluting the time line doesnt it'],
 'GUINAN': [' thank you doctor this looks like a great racquet but er i dont play tennis never have']}

Как заставить его не очищать каждый строка перед и только последняя строка для каждого символа

Ответы [ 3 ]

1 голос
/ 27 апреля 2020

Эта строка char_corpuses[char] = [row['dialogue']] перезаписывает содержимое списка текущей диалоговой строкой каждый раз, когда запускается l oop. Он записывает отдельный элемент вместо добавления.

Для словаря 'vanilla' попробуйте:

import pandas
d = {'Character': ['PICARD', 'DATA', 'PICARD'], 'dialogue': ['You will agree Data that Starfleets order are...', 'Difficult? Simply solve the mystery of Farpoint Station.', 'As simple as that.']}
df = pandas.DataFrame(data=d)
main_chars = ['PICARD', 'DATA']
char_corpuses = {}


for label, row in df.iterrows():
    for char in main_chars:
        if row['Character'] == char:
            try:
                # Try to append the current dialogue line to array
                char_corpuses[char].append(row['dialogue'])
            except KeyError:
                # The key doesn't exist yet, create empty list for the key [char]
                char_corpuses[char] = []
                char_corpuses[char].append(row['dialogue'])

Вывод

{'PICARD': ['You Согласитесь Данные о том, что порядок Звездных Флотов ... ',' Так просто. '],' ДАННЫЕ ': [' Сложно? Просто раскройте тайну станции Фарпойнт. ']}

1 голос
/ 27 апреля 2020

Попробуйте что-то вроде этого ^^

char_corpuses = {}
for char in main_chars:
  char_corpuses[char] = df[df.name == char]['dialogue'].values
0 голосов
/ 27 апреля 2020
TopHowmany = 10         #  This you can change as you want.

subDF = df[df.Charactar.isin(df.Charactar.value_counts()[0:TopHowmany].index)]

char_corpuses = {}
for x in subDF.index:
    char = subDF.loc[x,'Charactar']
    dialogue = subDF.loc[x,'Dialogue']
    if subDF.loc[x,'Charactar'] in char_corpuses:
        char_corpuses[char].append('dialogue')
    else:
        char_corpuses[char] = [dialogue]
...