Как удалить символы в кадре данных pandas при парсинге веб-страниц с помощью Python? - PullRequest
1 голос
/ 26 мая 2020

Я пытаюсь выполнить парсинг в Интернете, используя Python 3, таблицу с этого веб-сайта в файл .csv: Национальное расписание NBA 2011-2012 гг.

Таблица начинается например:

                Revised Schedule                    Original Schedule

Date            Time      Game                Net   Time      Game                  Net
Sun., 12/25/11  12 PM     BOS (1) at NY (1)   TNT   12 PM     BOS (7) at NY (7)     ESPN
Sun., 12/25/11  2:30 PM   MIA (1) at DAL (1)  ABC   2:30 PM   MIA (8) at DAL (5)    ABC
Sun., 12/25/11  5 PM      CHI (1) at LAL (1)  ABC   5 PM      CHI (6) at LAL (9)    ABC
Sun., 12/25/11  8 PM      ORL (1) at OKC (1)  ESPN  no game   no game               no game
Sun., 12/25/11  10:30 PM  LAC (1) at GS (1)   ESPN  no game   no game               no game
Tue., 12/27/11  8 PM      BOS (2) at MIA (2)  TNT   no game   no game               no game
Tue., 12/27/11  10:30 PM  UTA (1) at LAL (2)  TNT   no game   no game               no game

Меня интересует только пересмотренное расписание, которое представляет собой первые 4 столбца. Вывод, который мне нужен в файле .csv, выглядит следующим образом:

Output in .csv File

Я использую эти пакеты:

import re
import requests
import pandas as pd
import numpy as np
from bs4 import BeautifulSoup
from itertools import groupby

Это это код, который я сделал для соответствия желаемому формату:

df = pd.read_html("https://www.sportsmediawatch.com/2011/12/revised-2011-12-nba-national-tv-schedule/", header=0)[0]

revisedCols = ['Date'] + [ col for col in df.columns if 'Revised' in col ]
df = df[revisedCols]

df.columns = df.iloc[0,:]

df = df.iloc[1:,:].reset_index(drop=True)


# Format Date to m/d/y
df['Date'] = np.where(df.Date.str.startswith(('10/', '11/', '12/')), df.Date + ' 11', df.Date + ' 12')
df['Date']=pd.to_datetime(df['Date'])
df['Date']=df['Date'].dt.strftime('%m/%d/%Y')

# Split the Game column
df[['Away','Home']] = df.Game.str.split('at',expand=True)   


# Final dataframe with desired columns
df = df[['Date','Time','Away','Home','Net']]

df.columns = ['Date', 'Time', 'Away', 'Home', 'Network']

print(df)

Вывод:

           Date      Time      Away        Home Network
0    12/25/2011     12 PM   BOS (1)      NY (1)     TNT
1    12/25/2011   2:30 PM   MIA (1)     DAL (1)     ABC
2    12/25/2011      5 PM   CHI (1)     LAL (1)     ABC
3    12/25/2011      8 PM   ORL (1)     OKC (1)    ESPN
4    12/25/2011  10:30 PM   LAC (1)      GS (1)    ESPN
5    12/27/2011      8 PM   BOS (2)     MIA (2)     TNT
6    12/27/2011  10:30 PM   UTA (1)     LAL (2)     TNT

Я заметил, что есть (1), (2) , эт c. рядом с названием каждой команды в столбцах На выезде и Дома. Как применить скребок для удаления (1), (2) и т. Д. c. рядом с названием каждой команды в столбцах На выезде и Дома?

Ответы [ 4 ]

2 голосов
/ 26 мая 2020

вы можете использовать str.replace с круглыми скобками и числом (ами), а также str.strip, и кажется, что в начале или в конце есть пробелы:

df['Away'] = df['Away'].str.replace('\(\d*\)', '').str.strip()
df['Home'] = df['Home'].str.replace('\(\d*\)', '').str.strip()
print (df.head())
         Date      Time Away Home Network
0  12/25/2011     12 PM  BOS   NY     TNT
1  12/25/2011   2:30 PM  MIA  DAL     ABC
2  12/25/2011      5 PM  CHI  LAL     ABC
3  12/25/2011      8 PM  ORL  OKC    ESPN
4  12/25/2011  10:30 PM  LAC   GS    ESPN
0 голосов
/ 26 мая 2020

Вместо разделения столбца Game на 'at 'не указывайте специально разделитель. .split() будет разделен на каждое пустое пространство, и тогда вам просто нужны значения индекса 0 и 3-го индекса. Так что просто измените 1 строку кода:

с df[['Away','Home']] = df.Game.str.split('at',expand=True) на df[['Away','Home']] = df.Game.str.split(expand=True)[[0,3]]

import pandas as pd
import numpy as np

df = pd.read_html("https://www.sportsmediawatch.com/2011/12/revised-2011-12-nba-national-tv-schedule/", header=0)[0]

revisedCols = ['Date'] + [ col for col in df.columns if 'Revised' in col ]
df = df[revisedCols]

df.columns = df.iloc[0,:]

df = df.iloc[1:,:].reset_index(drop=True)


# Format Date to m/d/y
df['Date'] = np.where(df.Date.str.startswith(('10/', '11/', '12/')), df.Date + ' 11', df.Date + ' 12')
df['Date']=pd.to_datetime(df['Date'])
df['Date']=df['Date'].dt.strftime('%m/%d/%Y')

# Split the Game column
df[['Away','Home']] = df.Game.str.split(expand=True)[[0,3]]   


# Final dataframe with desired columns
df = df[['Date','Time','Away','Home','Net']]

df.columns = ['Date', 'Time', 'Away', 'Home', 'Network']

print(df)
0 голосов
/ 26 мая 2020

Вы можете добавить этот код после разделения колонки Game

df['Away']=df['Away'].astype(str).str[0:-4]
df['Home']=df['Home'].astype(str).str[0:-4]
0 голосов
/ 26 мая 2020
import re
import numpy as np
import pandas as pd

dataset = pd.read_csv("Dataset.csv")
dataset.rename(columns={'Country(or dependent territory)': 'Country'}, inplace = True)
dataset.rename(columns={'% of worldpopulation': 'Percentage of World Population'}, inplace = True)
dataset.rename(columns={'Total Area': 'Total Area (km2)'}, inplace = True)
...