2017-09-09 39 views
3

私はbeautifulsoupを使ってサッカー選手の細部を作業可能なパンダテーブルにこすっているのが本当に難しいです。パンダ - 空のセルを扱う

私が掻き集めるデータの一部は「余分な」もので、ナンセンスでテーブルの行をいっぱいにしています。

import requests 
from bs4 import BeautifulSoup 
import pandas as pd 
import numpy as np 

HEADERS = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:20.0) Gecko/20100101 Firefox/20.0"} 

page = requests.get('https://www.transfermarkt.co.uk/manchester-united/startseite/verein/985', headers=HEADERS) 
soup = BeautifulSoup(page.content, 'html.parser') 

playerdata = soup.find_all(class_='posrela') 
names = [';'.join(pt.findAll(text=True)) for pt in playerdata] 

df = pd.DataFrame(names) 
df = pd.DataFrame([sub.split(";") for sub in names]) 

print(df.replace('^$', np.nan, regex=True)) 

結果:たとえば、私は空のデータを掻き取ってきた

python testing5.py 
        0    1     2     3 
0   David de Gea  D. de Gea    Keeper    None 
1  Sergio Romero  S. Romero    Keeper    None 
2   Joel Pereira  J. Pereira    Keeper    None 
3   Eric Bailly  E. Bailly         Centre-Back 
4  Victor Lindelöf  V. Lindelöf   Centre-Back    None 
5   Marcos Rojo   M. Rojo         Centre-Back 
6  Chris Smalling  C. Smalling   Centre-Back    None 
7   Phil Jones  P. Jones         Centre-Back 
8   Daley Blind  D. Blind   Left-Back    None 
9   Luke Shaw  Luke Shaw   Left-Back    None 
10  Matteo Darmian  M. Darmian   Right-Back    None 
11 Antonio Valencia  A. Valencia   Right-Back    None 
12  Nemanja Matic  N. Matic Defensive Midfield    None 
13  Michael Carrick  M. Carrick       Defensive Midfield 
14   Paul Pogba  P. Pogba Central Midfield    None 
15  Ander Herrera  A. Herrera Central Midfield    None 
16 Marouane Fellaini  M. Fellaini Central Midfield    None 
17  Ashley Young  A. Young  Left Midfield    None 
18 Henrikh Mkhitaryan H. Mkhitaryan Attacking Midfield    None 
19   Juan Mata  Juan Mata Attacking Midfield    None 
20  Jesse Lingard  J. Lingard   Left Wing    None 
21  Romelu Lukaku  R. Lukaku  Centre-Forward    None 
22  Anthony Martial  A. Martial      .  Centre-Forward 
23  Marcus Rashford  M. Rashford  Centre-Forward    None 
24 Zlatan Ibrahimovic Z. Ibrahimovic        Centre-Forward 

あなたが見ることができるように、それは間違ったセルにデータをプッシュしています。あなたはなぜ私が4列目を持っているのか聞いているかもしれませんが、そこにデータを挿入するつもりですが、今は3列目をきれいにする必要があります。

私が見るとおり、最初のインスタンスでNaNの空白。しかし、私が何をしようと、私は空のセルを "選択"することはできません。私は彼らに行くことができない!

私はリストのように '名前'を扱うと、これはリストではなく結果セットであると通訳者に伝えられます。

誰かが助けてくれるのであれば、私は多くの進歩を遂げましたが、レンガの壁にぶつかりました。

答えて

1

が、私はあなたがそれをすべて抽出することを示唆していますデータフレームに容易に適合するオーダです。適切なフォーマットでデータを抽出しない限り、不要なクリーンアップ操作を継続して実行する必要があります。

playerdata = soup.find_all(class_='inline-table') 

names = [[x.find('img')['title'], 
     x.find_all(class_='spielprofil_tooltip')[-1].renderContents(), 
     x.find_all('tr')[-1].find('td').renderContents()] for x in playerdata] 

df = pd.DataFrame(names,columns=['Name','Short','Position']) 


        Name   Short   Position 
0   David de Gea  D. de Gea    Keeper 
1  Sergio Romero  S. Romero    Keeper 
2   Joel Pereira  J. Pereira    Keeper 
3   Eric Bailly  E. Bailly   Centre-Back 
4  Victor Lindelöf  V. Lindelöf   Centre-Back 
5   Marcos Rojo   M. Rojo   Centre-Back 
6  Chris Smalling  C. Smalling   Centre-Back 
7   Phil Jones   P. Jones   Centre-Back 
8   Daley Blind   D. Blind   Left-Back 
9   Luke Shaw  Luke Shaw   Left-Back 
10  Matteo Darmian  M. Darmian   Right-Back 
11 Antonio Valencia  A. Valencia   Right-Back 
12  Nemanja Matic   N. Matic Defensive Midfield 
13  Michael Carrick  M. Carrick Defensive Midfield 
14   Paul Pogba   P. Pogba Central Midfield 
15  Ander Herrera  A. Herrera Central Midfield 
16 Marouane Fellaini  M. Fellaini Central Midfield 
17  Ashley Young   A. Young  Left Midfield 
18 Henrikh Mkhitaryan H. Mkhitaryan Attacking Midfield 
19   Juan Mata  Juan Mata Attacking Midfield 
20  Jesse Lingard  J. Lingard   Left Wing 
21  Romelu Lukaku  R. Lukaku  Centre-Forward 
22  Anthony Martial  A. Martial  Centre-Forward 
23  Marcus Rashford  M. Rashford  Centre-Forward 
24 Zlatan Ibrahimovic Z. Ibrahimovic  Centre-Forward 
25  Romelu Lukaku Romelu Lukaku  Centre-Forward 
26   Paul Pogba  Paul Pogba Central Midfield 
27  Anthony Martial Anthony Martial  Centre-Forward 
28  Marcus Rashford Marcus Rashford  Centre-Forward 
29   Eric Bailly  Eric Bailly   Centre-Back 
+0

偉大な答え、私は美しいとあなたと提携して戦った(正しいことを示唆したように)最初の場所で正しいソースデータを取得します。明らかに私はあまりうまくいきませんでした!選択するとあまり良くありません。しかし、私はあなたが100%正しかったと思っています。まず最初にソースを入手するほうがはるかに効率的なやり方です。ありがとうございます。 – charliedontsurf

+0

@charliedontsurf、うれしい!あなたはより多くのデータをスクラップしなければならないと確信しています。あなたが右クリックしてinspectをクリックするのを好むクロムを使用しているなら、websrcapingのための最も優れたツールです。ツリー上で作業し、ページ上の位置を強調表示することができます。その後、一度にbs4レベルでフィルタリングしてみてください:) – DJK

+0

私は別の質問があります(私は良い進歩を遂げました!)しかし、私が描くアイテムのいくつかは時々abのプレフィックスと時には[b '... ] これはなぜわからないのですか?私は先に進む前に結果を整理したいと思っています。私はそれが私が掻いているデータの種類と関係があると思います... – charliedontsurf

2

あなたは、後処理を使用することができます - locnotnullと列2に列3から非NaNを置き換える:

df.loc[df[3].notnull(), 2] = df[3] 
#remove column 3 
df = df.drop(3, axis=1) 

別の解決策をmaskである:

df[2] = df[2].mask(df[3].notnull(), df[3]) 
df = df.drop(3, axis=1) 

それともnumpy.whereと非常に似て:

df[2] = np.where(df[3].notnull(), df[3], df[2]) 
df = df.drop(3, axis=1) 

は、私は少しあなたのソリューションを改善してみてください。

playerdata = soup.find_all(class_='posrela') 
names = [list(pt.findAll(text=True)) for pt in playerdata] 
df = pd.DataFrame(names) 
df.loc[df[3].notnull(), 2] = df[3] 
df = df.drop(3, axis=1) 
print (df) 

        0    1     2 
0   David de Gea  D. de Gea    Keeper 
1  Sergio Romero  S. Romero    Keeper 
2   Joel Pereira  J. Pereira    Keeper 
3   Eric Bailly  E. Bailly   Centre-Back 
4  Victor Lindelöf  V. Lindelöf   Centre-Back 
5   Marcos Rojo   M. Rojo   Centre-Back 
6  Chris Smalling  C. Smalling   Centre-Back 
7   Phil Jones  P. Jones   Centre-Back 
8   Daley Blind  D. Blind   Left-Back 
9   Luke Shaw  Luke Shaw   Left-Back 
10  Matteo Darmian  M. Darmian   Right-Back 
11 Antonio Valencia  A. Valencia   Right-Back 
12  Nemanja Matic  N. Matic Defensive Midfield 
13  Michael Carrick  M. Carrick Defensive Midfield 
14   Paul Pogba  P. Pogba Central Midfield 
15  Ander Herrera  A. Herrera Central Midfield 
16 Marouane Fellaini  M. Fellaini Central Midfield 
17  Ashley Young  A. Young  Left Midfield 
18 Henrikh Mkhitaryan H. Mkhitaryan Attacking Midfield 
19   Juan Mata  Juan Mata Attacking Midfield 
20  Jesse Lingard  J. Lingard   Left Wing 
21  Romelu Lukaku  R. Lukaku  Centre-Forward 
22  Anthony Martial  A. Martial  Centre-Forward 
23  Marcus Rashford  M. Rashford  Centre-Forward 
24 Zlatan Ibrahimovic Z. Ibrahimovic  Centre-Forward 

別の解決策:あなたがより多くのデータを抽出しようとしている場合

playerdata = soup.find_all(class_='posrela') 

names = [] 
for pt in playerdata: 
    L = list(pt.findAll(text=True)) 
    #check length of list 
    if len(L) == 4: 
     #assign 4. value to 3. 
     L[2] = L[3] 
    #appenf first 3 values in list 
    names.append(L[:3]) 

df = pd.DataFrame(names) 

print (df) 
        0    1     2 
0   David de Gea  D. de Gea    Keeper 
1  Sergio Romero  S. Romero    Keeper 
2   Joel Pereira  J. Pereira    Keeper 
3   Eric Bailly  E. Bailly   Centre-Back 
4  Victor Lindelöf  V. Lindelöf   Centre-Back 
5   Marcos Rojo   M. Rojo   Centre-Back 
6  Chris Smalling  C. Smalling   Centre-Back 
7   Phil Jones  P. Jones   Centre-Back 
8   Daley Blind  D. Blind   Left-Back 
9   Luke Shaw  Luke Shaw   Left-Back 
10  Matteo Darmian  M. Darmian   Right-Back 
11 Antonio Valencia  A. Valencia   Right-Back 
12  Nemanja Matic  N. Matic Defensive Midfield 
13  Michael Carrick  M. Carrick Defensive Midfield 
14   Paul Pogba  P. Pogba Central Midfield 
15  Ander Herrera  A. Herrera Central Midfield 
16 Marouane Fellaini  M. Fellaini Central Midfield 
17  Ashley Young  A. Young  Left Midfield 
18 Henrikh Mkhitaryan H. Mkhitaryan Attacking Midfield 
19   Juan Mata  Juan Mata Attacking Midfield 
20  Jesse Lingard  J. Lingard   Left Wing 
21  Romelu Lukaku  R. Lukaku  Centre-Forward 
22  Anthony Martial  A. Martial  Centre-Forward 
23  Marcus Rashford  M. Rashford  Centre-Forward 
24 Zlatan Ibrahimovic Z. Ibrahimovic  Centre-Forward 
+1

ありがとうございます。今、私の周りに頭を浮かべてください。私は "細胞"を選抜するためにlocを使用したが、残りのものはいくつかの考えをとるだろう。 **あなたの編集に感謝しました。もう一度感謝します。 – charliedontsurf

+1

喜んで助けることができます、私は少しあなたのソリューションを改善し、別のものを追加します。素敵な週末! – jezrael

関連する問題