Применить функцию синтаксического анализа к Pandas DataFrame - PullRequest
0 голосов
/ 21 марта 2020

У меня есть следующий DF:

pd.DataFrame({'Data': ['Nov, 2018', '20 Sep 2019\xa0android-3','12 Nov 2019android-3', '11 Jun 2019roku-3\xa011 Sep 2019', 
                       '11 Jun 2019roku-3\xa011 Sep 2019', '06 Jan 2020\xa0android-3', '19 Dec 2019\xa0android-3',
                       '12 Nov 2019\xa0apple-4', '22 Nov 2019\xa0apple-4', '11 Jul 2019\xa0x1-2']})

Я пытаюсь создать второй столбец, который состоит только из платформы в каждой строке без дат. Для этого у меня есть функция с именем extract_date():

def extract_date(date):
    val  = re.findall('\d{2} \w{3} \d{4}', date)
    if len(val) == 1:
        return val[0]
    else:
        return val

Когда я запускаю эту функцию для отдельной строки, я могу получить желаемый результат:

s = '27 Feb 2020 roku-5.002 Mar 2020 roku-5.0.1'
mydict = dict.fromkeys(extract_date(s), '')
for k, v in mydict.items():
    s = s.replace(k, v).strip()

'roku-5.0 roku-5.0.1'

Однако, когда я пытаюсь применить его к столбцу данных, я не получаю те же результаты:

def strip_dates(x):
    if type(x) == float:
        return x
    else:
        mydict = dict.fromkeys(extract_date(x), '')
        for k, v in mydict.items():
            return x.replace(k, v).strip()

df['Data Text'] = df.apply(lambda row: strip_dates(row['Data']), axis=1)


                                 Data                Data Text
0                           Nov, 2018                     None
1               20 Sep 2019 android-3      0 Sep 019 android-3
2                12 Nov 2019android-3       2 Nov 209android-3
3       11 Jun 2019roku-3 11 Sep 2019       roku-3 11 Sep 2019
4       11 Jun 2019roku-3 11 Sep 2019       roku-3 11 Sep 2019

Может кто-нибудь сказать мне, что не так с моим подходом в применении функции? Спасибо.

1 Ответ

1 голос
/ 21 марта 2020

В вашей функции:

def strip_dates(x):
    if type(x) == float:
        return x
    else:
        mydict = dict.fromkeys(extract_date(x), '')
        for k, v in mydict.items():
            return x.replace(k, v).strip()

Вы немедленно возвращаетесь в первый l oop по элементам словаря mydict:

return x.replace(k, v).strip()

Измените его на:

def strip_dates(x):
    if type(x) == float:
        return x
    else:
        mydict = dict.fromkeys(extract_date(x), '')
        s = str(x)
        for k, v in mydict.items():
             s = s.replace(k, v).strip()
        return s

Как видите, я повторно использовал строку из вашей функции, которую вы изменили, и, следовательно, s = str(x).

...