[英]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.