Неожиданный вывод при запросе индекса слова в списке - PullRequest
0 голосов
/ 28 апреля 2020

Итак, я передаю фрейм данных, по одной строке за раз, в функцию для поиска первого вхождения слова и возврата его индекса в новый столбец фрейма данных.

def fix_df(row):
    words= row['t_sents']
    tags= row['t_tags']
    return find_start(words, tags)    #get a row slice from two columns, 

def find_start(words, tags):
    try:
        idx = tags.index('ante')
    except ValueError:
        idx = None
    return idx 

bant_df['start_ante'] = bant_df.apply(fix_df, axis=1) #calling the ff

Мой вывод, однако, является неожиданным. например, глядя на снимок кадра данных


    t_sents     t_tags  start_ante
0   'Sandwich', 'in', 'Kent', ';', 'until', '2011...    '0', '0', '0', '0', 'ante', 'ante', '0', '0',...    22.0
1   'If', 'the', 'deals', 'were', 'properly', 'ac...    'ante', 'ante', 'ante', 'ante', 'ante', 'ante...    2.0
2   'These', 'distortions', 'have', 'seen', 'one'...    '0', '0', '0', '0', '0', '0', '0', '0', '0', ...    152.0

мой ожидаемый ответ в первом кадре должен быть 4, но у меня есть 22. Второй ряд должен быть 0, но у меня есть 2. что может быть не так ? Обратите внимание, что я только запросил слово во втором столбце t_tags.

Ответы [ 2 ]

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

Я думаю, что в вашей find_start функции idx = tags.index('ante') tags это pandas.Series, а не list, поэтому метод index работает по-другому. Если вы получаете данные из tags, выполняя tags.values.tolist(), вы можете использовать индексный метод list, который должен дать вам правильный результат.

Я сделал пример:

import pandas as pd

df = pd.DataFrame()
df['tags'] = ['0', '0', '0', '0', 'ante', 'ante', '0', '0']

type(df['tags'])
>>> pandas.core.series.Series

# you can get a list as
type(df['tags'].values.tolist()) # .values gets a numpy array which has a .tolist method
>>> list

df['tags'].values.tolist().index('ante')
>>> 4
0 голосов
/ 29 апреля 2020

сначала

import ast

затем немного изменив мой начальный код

def fix_df(row):
    words= row['t_sents']
    tags= row['t_tags']
    tags_as_list = ast.literal_eval(tags)    #included line of code
    return find_start(words, tags_as_list) 

def find_start(words, tags):
    try:
        idx = tags.index('ant')
    except ValueError:
        idx = None
    return idx 

df['start_ante'] = df.apply(fix_df, axis=1)

Это работает нормально

...