Jak mogę zastąpić wartości istniejącej kolumny dataframe wartościami z pętli re.search?

To jest moja pętla re.search.

for i in dataset['col1']:
    clean = re.search('(nan|[0-9]{1,4})([,.][0-9]{1,4})?', i)
    print(clean.group())    

To jest przykładowy zbiór danych (zbiór danych)

    year    col1
1    2001    10.563\D
2    2002    9.540\A
3    2003    4.674\G
4    2004    3.2754\u
5    2005    nan\x
3
Yel 1 kwiecień 2020, 09:54

4 odpowiedzi

Najlepsza odpowiedź

Możesz użyć Series.apply zastosować funkcję niestandardową do dataset["col1"]. Lub lepiej możesz użyć Series. str.replace, aby zastąpić wzorzec ciągiem zastępczym.

Spróbuj tego:

def func(i):
    clean = re.search('(nan|[0-9]{1,4})([,.][0-9]{1,4})?', i)
    return clean.group()

dataset["col1"] = dataset["col1"].apply(func)

Albo lepiej,

df["col1"] = df["col1"].str.replace(r'(.*?)(\\.*?$)', r"\1")

Wyjście :

>>> print(dataset)

   year    col1
0  2001  10.563
1  2002   9.540
2  2003   4.674
3  2004  3.2754
4  2005     nan
3
Shubham Sharma 1 kwiecień 2020, 07:08

Używając swojej metody:

dataset["col1"] = dataset["col1"].apply(lambda x: re.search('(nan|[0-9]{1,4})([,.][0-9]{1,4})?', x).group())

Choć osobiście zrobiłbym to zamiast tego:

dataset["col1"] = dataset["col1"].str[:-2]
2
Ryohei Namiki 1 kwiecień 2020, 07:02

Możesz użyć pand str extract z asercją wyprzedzającą - zachowa tylko elementy przed znakiem „\”

  df['cleaned'] = df["col1"].str.extract(r'(.*(?=\\))')

     year   col1        cleaned
1   2001    10.563\D    10.563
2   2002    9.540\A     9.540
3   2003    4.674\G     4.674
4   2004    3.2754\u    3.2754
5   2005    nan\x       nan
2
sammywemmy 1 kwiecień 2020, 07:29

W tym przypadku użyłbym funkcji split zamiast dłuższych wzorców wyrażeń regularnych:

dataset['col1'] = dataset['col1'].str.split('\\').str[0]

Lub, aby split na float typ danych:

dataset['col1'] = dataset['col1'].str.split('\\').str[0].astype(float)

Spowoduje to przekształcenie tych wartości w miejscu i nie jest podatne na błędy. Po prostu zawsze pobiera pierwszy element z wynikowej tablicy w przypadku, gdy istnieje ukośnik odwrotny.

Wynik:

   year    col1
0  2001  10.563
1  2002   9.540
2  2003   4.674
3  2004  3.2754
4  2005     nan
2
JvdV 1 kwiecień 2020, 09:21