Wycinanie fragmentu ciagu znaków - substring

0

Witajcie
Jestem dość początkującym programistą Pythona, ale to moje pierwsze zadanie wykorzystujące pandas oraz dataframe.
Mam kolumnę, która przechowuje pewien ciąg znaków:

colname
Imie=Adam<x>Nazwisko=Kowalski<x>Wiek=18<x>Miasto=Poznan<x>
Imie=Jan<x>Nazwisko=Nowak<x>Wiek=23<x>Miasto=Warszawa<x>

Chciałbym wyciągnąć z niej wyłącznie wiek, tak aby mieć osobną kolumnę:

Wiek
18
23

Gdyby to była zwykła wartość zmiennej zrobiłbym to tak:

s = colname.index('Wiek=') + len('Wiek=')
e = colname.index('<x>')
Wiek = colname[s:e]

Jednak takie podejście nie działa (konwersja na string też nie).

Znalazłem, że dataframe posiada funkcje

df.colname.str.index()
df.colname.str.extract()

Jednak wyniku funkcji index() nie mogę przypisać do zmiennej.
Mogę przypisać do kolumny, ale wtedy nie mogą podać jej jako argumentów funkcji extract().

Jakiś pomysł?

Pozdrawiam

0

Jakie to dane, jak je Zapisujesz?

0

chyba nie rozumiem pytania, ale postaram się odpowiedzieć.
Mój df to excel, który importuje tak:

df = pd.read_excel('file.xlsx','sheet')

z całego df, wyciąłem sobie dwie kolumny: jedna, to ta którą widzisz wyżej (colname), a druga to liczba wyswietleń (views):

df = df[['colname','views']]

i teraz rozparsowując ciąg znaków zawarty w kolumnie colname chciałbym otrzymać:

Imie views
Adam 5
Jan 10

Aby docelowo narysować z tego wykres.

0

Poczytaj o 'regular expressions'

0

Dalej nie mamy danych, żeby odtworzyć Twoją sytuację, ale jeśli Potrzebujesz dostępu do poszczególnych kolumn Zobacz tutaj:
https://stackoverflow.com/questions/10665889/how-to-take-column-slices-of-dataframe-in-pandas#10677896 ,
oraz tutaj:
https://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-advanced

0

prosze o usuniecie

0

prosze o usuniecie

0
Leroy napisał(a):

Poczytaj o 'regular expressions'

Czytałem, ale z jaką funkcją mogę je zastosować ? .extract() ?
Jak mogę ustawić punkt początkowy i końcowy? jako wartość zmiennej, czy jako kolejną kolumnę?

lion137 napisał(a):

Dalej nie mamy danych, żeby odtworzyć Twoją sytuację, ale jeśli Potrzebujesz dostępu do poszczególnych kolumn Zobacz tutaj:

Powiedz proszę o jakie dane chodzi a postaram się je dostarczyć. Tak jak wspominałem- nie jestem programistą pythona, zajmuje się nim w wolnej chwili, więc mogę pewnych rzeczy nie rozumieć. Linki za chwilę przejrzę.

0
gruby19 napisał(a):
gruby19 napisał(a):
Leroy napisał(a):

Poczytaj o 'regular expressions'
Czytałem, ale z jaką funkcją mogę je zastosować ? .extract() ?
Jak mogę ustawić punkt początkowy i końcowy? jako wartość zmiennej, czy jako kolejną kolumnę?

lion137 napisał(a):

Dalej nie mamy danych, żeby odtworzyć Twoją sytuację, ale jeśli Potrzebujesz dostępu do poszczególnych kolumn Zobacz tutaj:

Powiedz proszę o jakie dane chodzi a postaram się je dostarczyć. Tak jak wspominałem- nie jestem programistą pythona, zajmuje się nim w wolnej chwili, więc mogę pewnych rzeczy nie rozumieć. Linki za chwilę przejrzę.

Uploaduj ten plik albo jakiś podobny i Pokaż cały kod, ale najpierw Spróbuj zrobic tak jak w linkach, które wrzuciłem, bo to raczej jest to.

0
lion137 napisał(a):

Uploaduj ten plik albo jakiś podobny i Pokaż cały kod, ale najpierw Spróbuj zrobic tak jak w linkach, które wrzuciłem, bo to raczej jest to.

Mam nadzieję, że wszystko jest jasne, ale jakby co to pytać:

import pandas as pd
import dataframe as df

src = pd.read_excel('sample.xlsx','sheet')

# Pobieram sobie indeks, od którego chce wycinać
src['start'] = src.colname.str.index('rooms_num<=>') + len('rooms_num<=>')

# Pobieram index, do którego chce wycinać. src['start'] - jako punkt, od którego rozpoczynam wyszukiwanie
# src['end'] = src.colname.str.index('<br>', src['start'])

src['rooms'] = src.colname.str.slice(start=src['start'], stop=src['end'])

print(src)
0

Ta tabelka jest 9 na 2, więc Musisz się dostać do środka obiektów src['colname'], najlepiej skonwertować je do stringa:
list_str_obj = list(map(str, src['colname'][:]))
i teraz ręcznie wyciagać daną o wieku z każdego elementu listy(na przykład iterując po tych stringach i wrzucając do wyniku wszystko co jest po 'Wiek=', a przed '<'), a potem z tej listy Zrobisz sobie jakiś pandas object.
Metody na stringach tutaj:
https://docs.python.org/release/2.5.2/lib/string-methods.html

0
lion137 napisał(a):

Ta tabelka jest 9 na 2, więc Musisz się dostać do środka obiektów src['colname'], najlepiej skonwertować je do stringa:
list_str_obj = list(map(str, src['colname'][:]))
i teraz ręcznie wyciagać daną o wieku z każdego elementu listy(na przykład iterując po tych stringach i wrzucając do wyniku wszystko co jest po 'Wiek=', a przed '<'), a potem z tej listy Zrobisz sobie jakiś pandas object.
Metody na stringach tutaj:
https://docs.python.org/release/2.5.2/lib/string-methods.html

Tak na prawdę ta tabelka jest 30tyś na 9 ;) ale to prawda - chcę się dostać do środka obiektów src['colname'].

0
gruby19 napisał(a):
lion137 napisał(a):

Ta tabelka jest 9 na 2, więc Musisz się dostać do środka obiektów src['colname'], najlepiej skonwertować je do stringa:
list_str_obj = list(map(str, src['colname'][:]))
i teraz ręcznie wyciagać daną o wieku z każdego elementu listy(na przykład iterując po tych stringach i wrzucając do wyniku wszystko co jest po 'Wiek=', a przed '<'), a potem z tej listy Zrobisz sobie jakiś pandas object.
Metody na stringach tutaj:
https://docs.python.org/release/2.5.2/lib/string-methods.html

Tak na prawdę ta tabelka jest 30tyś na 9 ;) ale to prawda - chcę się dostać do środka obiektów src['colname'].

He, he, he, Próbujesz to zrobić? Czy Ci napisać, ale dopiero potem albo jutro, bo zaraz gram w brydża.

0

Nie chce kompletnej odpowiedzi, bo chciałbym to zrobić możliwie samemu. Niestety nie mam doświadczenia z dataframe i pandas, więc nie wiem jak się zachowują i jakie mają możliwości.
Wycięcie fragmentu tekstu jeśli jest wartością zmiennej jest proste i zajmuje mi 3 linijki, ale w tym przypadku to kosmos. Robie to cały dzień i nie mam żadnych postępów.
Będę wdzięczny, za każde dalsze wskazówki

0

OK, jeśli wykonasz to:
list_str_obj = list(map(str, src['colname'][:]))
i list_str_obj będzie równy temu(stringi w takim formacie jak w pierwszym poście):
["Imie=Adam<x>Nazwisko=Kowalski<x>Wiek=18<x>Miasto=Poznan<x>", "Imie=Jan<x>Nazwisko=Nowak<x>Wiek=23<x>Miasto=Warszawa<x>"]

to Bierzesz funkcję (najprostsza iteracja po stringu, żeby wyciągnąć potrzebny wiek, pewnie robi sie to łądniej, ale nie o tej porze i po turnieju:)):

def get_age(s1):
    out = []
    cnt = 0
    for i in range(len(s1)):
        if s1[i] == 'k' and s1[i + 1] == '=':
            k = i + 2
            while True:
                if s1[k] != '<':
                    out.append(s1[k])
                    k += 1
                else:
                    cnt = 1
                    break
        if cnt == 1:
            break
    return int("".join(out))

I teraz wystarczy ją zmapować, na list_str_obj:
age_list = list(map(get_age, list_str_obj));
age_list = [18, 23]
I z tej listy (age_list) Możesz sobie zrobić dataframe, whatever.

0

moze zamiast zabawiac sie metodami stringu opanowac troche regex, wbrew pozorom do wielu rzeczy wystarczy stworzenie regex object re.compile(pattern), potem uzywasz juz na obiekcie konkretnej metody, jak musisz szukac dluzsze rzeczy to ustawiasz flage DOTALL, poczytaj tez o greedy i nongreedy regex - i nie bedziesz musial ukladac logik ze stringiem. Gladko zaczniesz od ksiazki how to automate borring stuff with python, jest po ang za darmo, a i po polsku kupisz w ksiegarnii, jest tam rozdzial o regex, ksiazka dla newbie, wiec pojdzie lekko:)

1 użytkowników online, w tym zalogowanych: 0, gości: 1