Как вывести значения столбцов без знака "$", только числа?
Необходимо вывести некоторые столбцы из таблицы, исключив пустые строки и заменив строковые значения (например '$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)
