Как вывести значения столбцов без знака "$", только числа?

Необходимо вывести некоторые столбцы из таблицы, исключив пустые строки и заменив строковые значения (например '$0.05') в числовые (0.05)

import pandas as pd

df = pd.read_csv("/content/worldwide internet prices in 2022 - IN 2022.csv")
nn = df.dropna()
groups = nn[['Average price of 1GB (USD)', 'Cheapest 1GB for 30 days (USD)', 'Most expensive 1GB (USD)', 'Average price of 1GB (USD  at the start of 2021)', 'Average price of 1GB (USD – at start of 2020)']]
groups

введите сюда описание изображения


Ответы (2 шт):

Автор решения: Алексей Р
df = pd.DataFrame({'Average price of 1GB (USD)': ['$0.05', '$0.15', '$0.19', '$0.27', float('nan'), '$25.46', '$30.97', float('nan'), '$44.56', '$49.67'],
                   'Cheapest 1GB for 30 days (USD)': ['$0.02', '$0.10', '$0.05', '$0.09', float('nan'), '$20.37', '$13.27', float('nan'), '$29.71', '$45.16'],
                   'Most expensive 1GB (USD)': ['$20.95', '$7.08', '$0.85', '$3.54', float('nan'), '$25.46', '$121.65', float('nan'), '$82.26', '$63.22'],
                   'Average price of 1GB (USD at the start of 2021)': ['$0.11', '$0.21', '$0.59', '$0.43', float('nan'), '$27.41', '$28.26', float('nan'), '$40.41', '$12.78'],
                   'Average price of 1GB (USD - at start of 2020)': ['$0.90', '$0.27', '$3.57', '$1.73', float('nan'), '$3.59', '$5.33', float('nan'), '$55.47', '$47.39']})
df  = df.dropna().apply(lambda x: x.str.strip('$')).astype(float)
print(df)
   Average price of 1GB (USD)  Cheapest 1GB for 30 days (USD)  Most expensive 1GB (USD)  Average price of 1GB (USD at the start of 2021)  Average price of 1GB (USD - at start of 2020)
0                        0.05                            0.02                     20.95                                             0.11                                           0.90
1                        0.15                            0.10                      7.08                                             0.21                                           0.27
2                        0.19                            0.05                      0.85                                             0.59                                           3.57
3                        0.27                            0.09                      3.54                                             0.43                                           1.73
5                       25.46                           20.37                     25.46                                            27.41                                           3.59
6                       30.97                           13.27                    121.65                                            28.26                                           5.33
8                       44.56                           29.71                     82.26                                            40.41                                          55.47
9                       49.67                           45.16                     63.22                                            12.78                                          47.39

Дополнительно. Сравнение быстродействия решений - использование regex немного (~20%) медленнее.

from time import time

df = pd.DataFrame({f'col{i}': ['$0.01'] * 1000 for i in range(100)})


def f1(x):
    return x.apply(lambda x: x.str.strip('$')).astype(float)


def f2(x):
    return x.replace("\$", "", regex=True).astype(float)


n = 10 ** 2

w = []
for fun in f1, f2:
    t = time()
    for _ in range(n):
        fun(df)
    w.append((fun.__name__, time() - t))
for ww in w:
    print(f'{ww[0]}: {ww[1]:.06f}')
print(f'Дельта времени f2/f1, % = +{w[1][1]/w[0][1]-1:.2%}')
f1: 5.708001
f2: 7.029000
Дельта времени f2/f1, % = +23.14%
→ Ссылка
Автор решения: strawdog

Есть встроенный метод replace - можно обойтись без анонимной функции:

df = df.dropna().replace("\$","", regex=True).astype(float)
→ Ссылка