Извлекать только цифры и только строки из pandas данных - PullRequest
1 голос
/ 19 февраля 2020

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

import pandas as pd

df_num = pd.DataFrame({
        'Colors': ['lila1.5', 'rosa2.5', 'gelb3.5', 'grün4', 'rot5', 'schwarz6', 'grau7', 'weiß8', 'braun9', 'hellblau10'],
        'Animals': ['hu11nd', '12welpe', '13katze', 's14chlange', 'vo15gel', '16papagei', 'ku17h', '18ziege', '19pferd',
                    'esel20']
    })

for column in df_num.columns:
    df_num[column] = df_num[column].str.extract('(\d+)').astype(float)

print(df_num)

Я также пытался использовать '([\ d +] [\ d +. \ D +])' и '([\ d +. \ D +])'

Вот я получить вывод, но не то, что я ожидаю. Хотя я ожидаю числа с плавающей точкой, я не получаю 1,5 или 2,5.

Я получаю что-то похожее на изображение ниже:

enter image description here

df_str = pd.DataFrame({
        'Colors': ['lila1.5', 'rosa2.5', 'gelb3', 'grün4', 'rot5', 'schwarz6', 'grau7', 'weiß8', 'braun9', 'hellblau10'],
        'Animals': ['hu11nd', '12welpe', '13katze', 's14chlange', 'vo15gel', '16papagei', 'ku17h', '18ziege', '19pferd',
                    'esel20']
    })

for column in df_str.columns:
    df_str[column] = df_str[column].str.extract('([a-zA-Z]+)')

print(df_str)

В этом случае, когда число находится в конце или в начале, я получаю строку, но если число помещено в середину или любое другое место, то результат, которого я ожидаю, я не получаю. Токовый выход как на изображении ниже:

enter image description here

Я думаю, что мое регулярное выражение неверно. Какое регулярное выражение будет правильным для решения этих проблем? Или есть какой-нибудь другой способ извлечь только цифры и только строки в pandas dataframe?

Ответы [ 4 ]

3 голосов
/ 19 февраля 2020

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

df_num['colors_num'] = df_num.Colors.str.extract(r'(\d+[.\d]*)')
df_num['animals_num'] = df_num.Animals.str.extract(r'(\d+[.\d]*)')
df_num['colors_str'] = df_num.Colors.str.replace(r'(\d+[.\d]*)','')
df_num['animals_text'] = df_num.Animals.str.replace(r'(\d+[.\d]*)','')


    Colors  Animals colors_num  animals_num colors_str  animals_text
0   lila1.5 hu11nd  1.5 11  lila    hund
1   rosa2.5 12welpe 2.5 12  rosa    welpe
2   gelb3.5 13katze 3.5 13  gelb    katze
3   grün4   s14chlange  4   14  grün    schlange
4   rot5    vo15gel 5   15  rot vogel
5   schwarz6    16papagei   6   16  schwarz papagei
6   grau7   ku17h   7   17  grau    kuh
7   weiß8   18ziege 8   18  weiß    ziege
8   braun9  19pferd 9   19  braun   pferd
9   hellblau10  esel20  10  20  hellblau    esel
2 голосов
/ 19 февраля 2020

Вы можете использовать (\d+\.\d+|\d+) до extract ваших чисел и replace результаты с "", чтобы получить вашу строку.

print (df_num.assign(colors_num=df_num["Colors"].str.extract(r"(\d+\.\d+|\d+)"))
             .assign(colors_col=df_num["Colors"].str.replace(r"(\d+\.\d+|\d+)","")))

       Colors     Animals colors_num colors_col
0     lila1.5      hu11nd        1.5       lila
1     rosa2.5     12welpe        2.5       rosa
2     gelb3.5     13katze        3.5       gelb
3       grün4  s14chlange          4       grün
4        rot5     vo15gel          5        rot
5    schwarz6   16papagei          6    schwarz
6       grau7       ku17h          7       grau
7       weiß8     18ziege          8       weiß
8      braun9     19pferd          9      braun
9  hellblau10      esel20         10   hellblau
0 голосов
/ 19 февраля 2020

Самый простой способ go об этом - определить некоторые функции:

def text(x):
    return x.str.replace(r'[0-9.]+','')
def values(x):
    return x.str.extract(r'([0-9.]+)', expand = False)

df_str.transform([text,values])

          Colors          Animals       
       text values      text values
0      lila    1.5      hund     11
1      rosa    2.5     welpe     12
2      gelb      3     katze     13
3      grün      4  schlange     14
4       rot      5     vogel     15
5   schwarz      6   papagei     16
6      grau      7       kuh     17
7      weiß      8     ziege     18
8     braun      9     pferd     19
9  hellblau     10      esel     20
0 голосов
/ 19 февраля 2020

Вы можете воспользоваться встроенными str методами isnumeri c () или isalpha () вместо регулярных выражений. Смотрите ниже:

# get rid of letters and handle floating points
>>> "".join([c for c in "word234with23numbers" if c.isnumeric() or c == "."])
"23423"

>>> "".join([c for c in "gelb3.5" if c.isnumeric() or c == "."])
"3.5"

# get rid of numbers
>>> "".join([c for c in "word234with23numbers" if c.isalpha()])
"wordwithnumbers"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...