2017-08-26 67 views
0

我有一个功能,我把它从一长串URL(棒球统计)刮表数据。每个URL输入包含一个单一播放器的唯一表格,并包含多行数据。每个URL中的行代表玩家职业生涯中的所有季节。当然,输入参数是我所抓取的所有URL的列表。使用函数将唯一标识符附加到输出列表中的每个子列表?

因此,列表清单的整体列表包含多个玩家的统计数据。对于每个玩家,我们有多行代表他们职业生涯的所有年份。

所有的URL都来自同一个域,但具有不同的扩展名。示例列表:

input_list = ['www.baseball.com/BarryBonds01', 'www.baseball.com/JohnRSmith01', 'www.baseballl.com/MickyJMantle01', 'www.baseball.com/JohnJSmith02, www.baseball.com/MickySMantle02] 

但是,每个URL页上的表不包含唯一标识符。因此,当我创建列表和最终数据框列表的最终列表时,我列出了一长串包含所有数据的列,但没有任何内容唯一标识整个数据框中的每个子列表。

如何为每个子列表添加唯一标识符(对于每个玩家)?一个理想的标识符将是URL扩展名,但我无法弄清楚代码是如何实现这一点的。

目前,我的名单列表的输出列表看起来是这样的(列表的列表更广泛的列表中列出的每个列表是一个单人):

output_list = [[[45, 54, 23, 23], [44, 22, 11, 55]], # Player A 
       [[32, 23, 54, 23], [223, 44, 55, 66], [23, 67, 74, 24]], # Player B 
       [[32, 46, 77, 44], [24, 65, 24, 44]], # Player C 
       [[23, 2, 5, 7], [22, 455, 44, 332]], # Player D 
       [[33, 33, 22, 55], [88, 2, 4, 66], [1, 0, 0, 8], [3, 3, 5, 6]]] # Player E 

输出的身影,不过,长相像这样 - 没有识别属于特定玩家的行数据。

dataframe image baseball data

这里是我的输出列表的一个更好的表示:

output_list = [[45, 54, 23, 23], [44, 22, 11, 55], # Player A 
        [32, 23, 54, 23], [223, 44, 55, 66], [23, 67, 74, 24], # Player B 
        [32, 46, 77, 44], [24, 65, 24, 44], # Player C 
        [23, 2, 5, 7], [22, 455, 44, 332], # Player D 
        [33, 33, 22, 55], [88, 2, 4, 66], [1, 0, 0, 8], [3, 3, 5, 6]] # Player E 
+1

这听起来像你想存储的URL作为键(或至少基本URL的唯一分机)的字典,并数据作为一个值。没有更多的信息,这是不可能的。 – roganjosh

+0

我添加了澄清信息,希望能够使我的问题更易于理解。谢谢! – TJE

+0

请提供您希望的输出结果的例子。 –

回答

1

这并不是一个非常可靠的方法来达到你想要的东西,但没有更多的细节是很难的建议。在紧缩,这应该工作:

# Since input and output are same length and aligned 
# We enumerate output to get the position, and value 
# Then use the position to find the corresponding element in input 
# Slice an identifier corresponding input 
# Append to all relevant output 

for index, player in enumerate(output_list): 

    # Slice URL from '/' onwards 
    identifier = input_list[index][input_list[index].find('/'):] 


    # loop through all players for stats 
    for stats in player: 

     # append identifier for each list of stat 
     stats.append(identifier) 

这应该给你的标识的附加列,当您转换列表名单列表的DF。

有更好的方法来完成这个,比如.zip()pd.DataFrame.from_dict(),但是这应该适合你的代码,而不会在下游有太多变化。


我会留下原始答案,以备将来为其他用户参考。

关于您的新输出格式,刮除后无法对其进行格式化。 '最简单'的方法是在期间使用上述方法添加标识符

例如:

master_list = [] 

for URL in input_list: 

    identifier = get_identifier(URL) 
    temp_list = run_scrape(URL) 

    for stats in temp_list 
     stats.append(identifier) 

    master_list = master_list + temp_list 

我不能给你具体的代码,因为我不知道你是如何做的事情。您需要的所有功能都可以从上面的样本中获得,或者可以保持原样。

总体思路是在每次获取对应于您的URL的新数据集之前添加标识符,然后将'已标识的数据'添加到master_list中,然后转到下一个URL。

根据你如何进行刮擦,你可能有或没有控制迭代过程。

  • 如果这样做,上面应该工作

  • 如果没有,请检查文档的音乐库中(应该有一些方法,允许这样的插入)

    • 如果该方法不存在,您可以检查文档以获得更多控制的较小函数(尽管您的代码将更复杂)

    • Y您可以检查S/O,看看是否有人与您使用的图书馆有类似的问题,以及他们如何解决问题。否则,您可以提出特定于您的图书馆的问题。

这不是一个大熊猫问题了

+0

我试过你的方法,但我得到了“AttributeError:'str'对象没有属性'追加'。”这是我以前尝试类似方法时得到的错误。感谢您的帮助。 – TJE

+0

我刚刚复制了代码,它的工作原理。你可以单独尝试吗?即只用输入,输出和上面的代码来运行代码,*没有任何代码前后的代码。 – Yeile

+0

在我的文章末尾查看我的编辑。是的,你的代码和我上面写的output_list一起工作。这个问题(我的错误)是,当我编写我的output_list示例时,我试图表明,双括号内的每个列表代表不同的玩家。但这实际上并不是我的output_list的样子 - 每个玩家都没有双括号。所以它只是一个列表,其中每个列表都是一行。我希望创建一个包含识别标签的列,其中包含与属于该玩家的每个行相对应的玩家名称。 – TJE

相关问题