Mam następującą ramkę danych: dane A(1,2,2) B(1,5) A(5,8, 9) B(8,9,0,9) Chciałbym przekonwertować te obiekty typu float (str) na int. Jak mogę to zrobić? Pożądane wyjście: dane A(1,2) B(1,5) A(6, ...

2
disukumo 28 czerwiec 2021, 14:05

3 odpowiedzi

Najlepsza odpowiedź

Masz ciąg znaków i musisz najpierw oddzielić liczby od siebie, prawdopodobnie funkcja niestandardowa może być najprostszym sposobem:

def round_string(s):
    start = s.index('(') +1
    stop = s.index(')')
    l = s[start:stop].split(',')
    lst = [str(int(round(float(i)))) for i in l]
    return s[:start] + ','.join(lst) + s[stop:]

s = "B(8.9,0.9)"
round_string(s)
# 'B(9,1)'

Funkcja mapowania do ramki danych:

df['data'].map(round_string)
1
Andreas 28 czerwiec 2021, 11:16

Więc to, co chcesz zrobić, to przekonwertować pływaki zagnieżdżone w łańcuchach na int.

Co więcej, twoje dane wyjściowe sugerują, że nie chcesz używać funkcji int, ale prawdopodobnie round(x,0) (mówię to, ponieważ int(5.8) oblicza 5, a nie 6.

Więc funkcja taka jak ta zastosowana do ramki danych będzie działać:

def convert_fn_strs(fn):
    val_list = re.split('[(,)]',fn)
    val_list.remove('')
    fn_name = val_list.pop(0)
    val_list = [round(float(x)) for i,x in enumerate(val_list)]
    return fn_name + str(tuple(val_list))```


1
Clay Shwery 28 czerwiec 2021, 11:30

Jeśli nie musisz zaokrąglać, powinno zadziałać następujące, zastąpienie miejsca dziesiętnego i cyfr po przecinku pustym ciągiem

df['data'].str.replace('\.\d+', '', regex=True)
0     A(1,2)
1     B(1,5)
2    A(5, 9)
3     B(8,0)
Name: col, dtype: object

Aby zaokrąglić wartości, potrzeba trochę więcej wysiłku, po prostu extract część nawiasu za pomocą regex i przypisz ją do tymczasowej kolumny, a następnie użyj zrozumienia, aby zaokrąglić każdą wartość, wywołując ostatecznie eval zastąp nową wartością w danej kolumnie.

df.assign(tup=df['data'].str.extract('(\(.*\))')).apply(lambda x: x['data'].replace(x['tup'], str(tuple(round(i) for i in eval(x['tup'])))), axis=1)

0    A(1, 2)
1    B(1, 5)
2    A(6, 9)
3    B(9, 1)
dtype: object
1
Don'tAccept 28 czerwiec 2021, 11:25