熊猫刮掉了大熊猫无效的数据

时间:2017-12-05 16:59:31

标签: python python-3.x pandas selenium screen-scraping

为什么当我手动将数据输入到Excel中时,pandas可以正常工作。然而,当我刮取数据时,将其放入csv。它给了我:

    zz = df1.WE=np.where(df3.AL.isin(df1.EW),df1.WE,np.nan)
ValueError: operands could not be broadcast together with shapes (148,) (537,) () 

其他网站没有发生过这种情况。我错过了一些明显的东西吗? excel是否格式不正确或者数据在某种程度上是不同的?

DF3

df3 = pd.DataFrame(columns=['DAT', 'G', 'TN', 'O1', 'L1', 'TN2', 'O2', 'L2', 'D', 'AJ', 'AK', 'AL'])

DF1

                                         EW    WE  \
0             Ponte Preta U20 v Cruzeiro U20  2.10   
1  Fluminense RJ U20 v Defensor Sporting U20  2.00   
2              Gremio RS U20 v Palmeiras U20  3.30   
3                       Barcelona v Sporting  1.33   

                                                  DA  
0  https://www.bet365.com.au/#/AC/B1/C1/D13/E40/F...  
1  https://www.bet365.com.au/#/AC/B1/C1/D13/E40/F...  
2  https://www.bet365.com.au/#/AC/B1/C1/D13/E40/F...  
3  https://www.bet365.com.au/#/AC/B1/C1/D13/E40/F...  

代码:

df3 = pd.DataFrame(columns=['DAT', 'G', 'TN', 'O1', 'L1', 'TN2', 'O2', 'L2', 'D', 'AJ', 'AK', 'AL'])

df3['DAT'] = df2['AA']



zz = df1.WE=np.where(df3.AL.isin(df1.EW),df1.WE,np.nan)
print(zz)

我提供了创建数据帧1,2和pandas代码的所有脚本,直到它创建错误here

我一直在

错误:

    zz = df1.WE=np.where(df3.AL.isin(df1.EW),df1.WE,np.nan)
ValueError: operands could not be broadcast together with shapes (0,) (4,) ()

从scrape创建的错误文件并作为数据框加载:

如果还不够,我也按原样加载文件。

File 1File 2

手动创建工作文件:

工作:

File 1File 2

知道如何解决这个问题吗?

3 个答案:

答案 0 :(得分:1)

我认为你需要改变:

df1.WE=np.where(df3.AL.isin(df1.EW),df1.WE,np.nan)

df1.WE=np.where(df1.EW.isin(df2.AL),df1.WE,np.nan)

问题是DataFrame与实际数据的长度不同。因此,需要使用其他数据更改df1的数据 - 与df1长度相同的返回值并且没有错误。

使用您的数据:

df1 = pd.read_csv('df1.csv', names=['a','b','c'])
print (df1.head())
                                           a     b  \
0             Ponte Preta U20 v Cruzeiro U20  2.10   
1  Fluminense RJ U20 v Defensor Sporting U20  2.00   
2              Gremio RS U20 v Palmeiras U20  3.30   
3                       Barcelona v Sporting  1.33   
4                        Bayern Munich v PSG  2.40   

                                                   c  
0  https://www.bet365.com.au/#/AC/B1/C1/D13/E40/F...  
1  https://www.bet365.com.au/#/AC/B1/C1/D13/E40/F...  
2  https://www.bet365.com.au/#/AC/B1/C1/D13/E40/F...  
3  https://www.bet365.com.au/#/AC/B1/C1/D13/E40/F...  
4  https://www.bet365.com.au/#/AC/B1/C1/D13/E40/F...  
df2 = pd.read_csv('df2.csv', names=['a','b','c', 'd', 'e'])
print (df2.head())
                 a                    b                  c     d  \
0          In-Play      CSKA Moscow U19        Man Utd U19  1.14   
1          In-Play  Atletico Madrid U19        Chelsea U19  1.01   
2          In-Play         Juventus U19     Olympiakos U19  1.40   
3  Starting in 22'       Paris St-G U19  Bayern Munich U19  2.24   
4      Today 21:00         Man City U19       Shakhtar U19  2.66   

                                                   e  
0  https://www.betfair.com.au/exchange/plus/footb...  
1  https://www.betfair.com.au/exchange/plus/footb...  
2  https://www.betfair.com.au/exchange/plus/footb...  
3  https://www.betfair.com.au/exchange/plus/footb...  
4  https://www.betfair.com.au/exchange/plus/footb...  

comapre数字列,此处为bd

df1.b=np.where(df1.b.isin(df2.d),df1.b,np.nan)
#first 5 values is NaNs
print (df1.head())
                                           a   b  \
0             Ponte Preta U20 v Cruzeiro U20 NaN   
1  Fluminense RJ U20 v Defensor Sporting U20 NaN   
2              Gremio RS U20 v Palmeiras U20 NaN   
3                       Barcelona v Sporting NaN   
4                        Bayern Munich v PSG NaN  
                                                   c  
0  https://www.bet365.com.au/#/AC/B1/C1/D13/E40/F...  
1  https://www.bet365.com.au/#/AC/B1/C1/D13/E40/F...  
2  https://www.bet365.com.au/#/AC/B1/C1/D13/E40/F...  
3  https://www.bet365.com.au/#/AC/B1/C1/D13/E40/F...  
4  https://www.bet365.com.au/#/AC/B1/C1/D13/E40/F...  

#check if some not NaNs values in b column
print (df1[df1.b.notnull()])
                                       a      b  \
23                Swindon v Forest Green   1.40   
50       Sportivo Barracas v Canuelas FC  13.00   
80                              FC Nitra   1.53   
81                                   0-0   1.40   
83       Cape Town City v Maritzburg Utd   1.53   
84         Mamelodi Sundowns v Baroka FC   3.75   
90  Dorking Wanderers v Tonbridge Angels   1.53   
95             Coalville Town v Stamford   1.40   

                                                    c  
23  https://www.bet365.com.au/#/AC/B1/C1/D13/E40/F...  
50  https://www.bet365.com.au/#/AC/B1/C1/D13/E40/F...  
80  https://www.bet365.com.au/#/AC/B1/C1/D13/E40/F...  
81  https://www.bet365.com.au/#/AC/B1/C1/D13/E40/F...  
83  https://www.bet365.com.au/#/AC/B1/C1/D13/E40/F...  
84  https://www.bet365.com.au/#/AC/B1/C1/D13/E40/F...  
90  https://www.bet365.com.au/#/AC/B1/C1/D13/E40/F...  
95  https://www.bet365.com.au/#/AC/B1/C1/D13/E40/F...  

您的测试数据也存在相同的行数(4),因此没有错误。

答案 1 :(得分:0)

在旁注中,我建议将pandas函数与pandas一起使用:

df1.loc[~df1.EW.isin(df2.AL), 'WE'] = np.nan

答案 2 :(得分:0)

好的,让我们回到绘图板。上面的代码更干净,但与numpy完全相同。让我们分开你的代码。

1)我强烈建议您使用jupyter / jupyter笔记本来播放数据并了解每行的内容。看看这里,例如: https://gist.github.com/Casyfill/f432966ebabd93f4271e27a1e2e76579

所以,你的df1有100行3列。你的df2有42行5列。

现在,您创建df3作为空数据帧(0行)但是12列(顺便说一句,您可能应该使用更多解释性列名)。此步骤完全正常,而您不必事先定义所有列。

让我们进入第二行: df3 ['DAT'] = df2 ['AA']

这里你基本上从第二个数据帧复制列。现在,因为我们之前在df3中没有任何行,所以它是完全合法的操作。通过这样做,您可以在df3中创建42行。同样,这条线本身也很好。

现在,最后一行。这里的逻辑如下:首先,对于df3中的每一行,我们检查df3.AL的单元格(其值)是否在df1.EW列中。请注意,我们之前从未定义过df3.AL,因此整个列只包含NAN,因此这本身没有任何意义。

接下来,让我们假设df3.AL中有一些东西。当我们逐行检查所有内容时,我们将得到一个pd.Series(思考 - 一列)布尔值作为此测试的结果,列为42行。现在,我们尝试将此列用作“掩码”,它定义df1.WE应该是相同的还是默认为Nan。但你不能这样做,因为df1有100行,而不是42行! Hense,我们遇到了错误。

所以你需要重新定义你真正想要做的事情 - 目前还不清楚你在这里需要做什么。