как преобразовать значения mm: ss в кадре данных, используя python - PullRequest
1 голос
/ 02 февраля 2020

Я довольно новичок в pandas и у меня есть табличные данные, которые имеют 3 столбца, в которых (df.info() дает object тип) значения находятся в s и m:s. Я хотел бы преобразовать все m:s значения в s значения. Я оставлю несколько примеров для пояснения.

сейчас:

VT          FT          TTPF
1:28.8      1:17.2      30.4
1:06.4      1:06.2      16.8
38.6        26.2        10.8

должно быть:

VT          FT          TTPF
88.8        77.2        30.4
66.4        66.2        16.8
38.6        26.2        10.8

Извините, если я не смог предоставить все детали. Не стесняйтесь запрашивать изменения

1 Ответ

2 голосов
/ 02 февраля 2020

Сначала выберите только строковые столбцы с помощью DataFrame.select_dtypes и DataFrame.apply пользовательской функции с Series.str.contains для значений фильтра с :, а затем Series.str.split с приведением к числам с плавающей запятой, умноженным на 60 и суммированным вместе в Series.mask для строк с ::

def f(x):
    m = x.str.contains(':')
    y = x[m].str.split(':', expand=True)
    return x.mask(m, y[0].astype(float) * 60 + y[1].astype(float))

c = df.select_dtypes(object).columns
df[c] = df[c].apply(f).astype(float)
print (df)
     VT    FT  TTPF
0  88.8  77.2  30.4
1  66.4  66.2  16.8
2  38.6  26.2  10.8

Другая идея заключается в использовании DataFrame.applymap для поэлементной обработки:

def f(x):
    if ':' in str(x):
        a, b = x.split(':')
        return float(a) * 60 + float(b)
    else:
        return float(x)

df = df.applymap(f)
print (df)
     VT    FT  TTPF
0  88.8  77.2  30.4
1  66.4  66.2  16.8
2  38.6  26.2  10.8
...