Я хочу извлекать числа из таких строк, как 10.5 \ Q \ C, A14.5, 6.7 \ P, nan \ B \ T. Они появляются во многих столбцах. Каков наиболее эффективный способ удалить эти строки и получить только числа? Вот коды, которые я написал до сих пор:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from pylab import rcParams
%matplotlib inline

df = pd.read_csv('../assignment1/datasets/shared_prosperity_assignment_dataset_mangled.csv', na_values=['-','???','NAN',-1.5])

df['year'] = pd.to_datetime(df['year'])
df['yyyy'] = pd.DatetimeIndex(df['year']).year
df = df.set_index(["yyyy"], inplace=False).sort_index()

Примеры столбцов, в каждом поле которых содержатся строки и числа:

df['education_spend_as_percent_of_total_gov_expenses'].tail()
yyyy
2014    17.3\W
2015    17.8\K
2016    17.8\U
2017     nan\O
2018     nan\W
Name: education_spend_as_percent_of_total_gov_expenses, dtype: object

df['teriary_education_participation_rate'].tail()
yyyy
2014    10.2\Y\I
2015     9.8\G\L
2016     9.4\T\M
2017     nan\A\G
2018     nan\L\G
Name: teriary_education_participation_rate, dtype: object

Итак, как мне получить только числа? Есть ли другой способ, кроме использования регулярного выражения

0
Ilovenoodles 6 Апр 2021 в 02:41

2 ответа

Лучший ответ

Предполагая, что вы ожидаете только одно число в столбце, вы можете попробовать использовать здесь str.extract:

df["some_col"] = df["some_col"].str.extract(r'(\d+(?:\.\d+)?)')
3
Tim Biegeleisen 5 Апр 2021 в 23:46

Я бы использовал функцию с регулярным выражением, которая соответствует шаблону того, что вы видите. Поскольку вы пометили pandas и dataframe, я предполагаю, что вы работаете с dataframe, но пример вывода, безусловно, поможет. Вот как я бы с этим справился:

import pandas as pd
import numpy as np
import re

def extract_numbers (column1: str):
  result = np.nan
  for x in column1.split():
    if re.search(r'\d+\.?\d+', x)
      result = float(re.search(r'\d+\.?\d+', x).group())

    if pd.notnunll(result):
      return result

df['Numbers'] = df['YourColumn'].apply(extract_numbers)

Результатом этой функции будет новый столбец под названием «Числа», содержащий извлеченное число из каждой строки. Он вернет NaN, если число не найдено (или не найдено). Если у вас есть столбец с числовым значением из каждой строки, вы можете взаимодействовать с ним как угодно.

0
git_rekt 6 Апр 2021 в 00:28