繁体   English   中英

使用功能将唯一标识符附加到输出列表列表中的每个子列表?

[英]Using a function to append a unique identifier to each sub-list within an outputted list of lists?

我有一个功能,可以从一长串的网址(棒球统计信息)中抓取表格数据。 每个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

但是,输出图形看起来像这样-没有标识属于特定玩家的行数据。

数据框图像棒球数据

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

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

这不是实现所需目标的强大方法,但是如果没有更多细节,则很难提出建议。 在紧要关头,这应该起作用:

# 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)

当您将list of list转换为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的一组新数据时都添加标识符,然后将“ identified-data”添加到master_list,然后转到下一个URL。

根据您执行抓取的方式,您可以控制迭代过程,也可以不控制迭代过程。

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

  • 如果您不这样做,请检查您库的文档(应该有一些允许这种插入的方法)

    • 如果该方法不存在,则可以检查文档中是否有较小的函数,这些函数可以为您提供更多控制(尽管您的代码会更复杂)

    • 您可以检查S / O以查看是否有人在使用您的库时遇到类似的问题,以及他们是如何解决的。 否则,您可以问一个特定于您的图书馆的问题。

这不再是熊猫问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM