Python 将n*3矩阵转换为n*m矩阵
对于web服务器,我试图生成一个报告,给出在某个固定持续时间内(例如一小时)具有各种响应代码的请求数 根据原始http访问日志数据,我首先生成了一个数组数组,其中每行有3个单元格:小时、响应代码和请求数。然后从中生成最终结果。逻辑非常简单,对于输入中的每一行 我有它的工作,看到小样本,但它似乎并不“pythonic”,我想知道是否有更好的方法来做它。我有Python的初学者技能,没有接触过各种数据处理库 有更好的方法吗?是否有任何库可用于直接从初始原始数据生成最终结果 另外,我很确定转置不是这个转换的正确名称,如果有人能纠正我的话,我将不胜感激Python 将n*3矩阵转换为n*m矩阵,python,python-3.x,Python,Python 3.x,对于web服务器,我试图生成一个报告,给出在某个固定持续时间内(例如一小时)具有各种响应代码的请求数 根据原始http访问日志数据,我首先生成了一个数组数组,其中每行有3个单元格:小时、响应代码和请求数。然后从中生成最终结果。逻辑非常简单,对于输入中的每一行 我有它的工作,看到小样本,但它似乎并不“pythonic”,我想知道是否有更好的方法来做它。我有Python的初学者技能,没有接触过各种数据处理库 有更好的方法吗?是否有任何库可用于直接从初始原始数据生成最终结果 另外,我很确定转置不是这个
#! /usr/bin/python3
'''
data is an array of array n*3:
h resp count
1 200 15
1 201 23
2 200 9
2 201 75
2 404 5
result is an array of n*m:
200 202 404
1 15 23 0
2 9 75 5
'''
def process(data):
result = [[None]]
for inrow in data:
r,c,v = inrow[0], inrow[1], inrow[2]
row = find_row(result, r)
idx = find_column_index(result, c)
row[idx] = v
return result
def find_row(result, r):
row = next((row for row in result[1:] if row[0] == r), None)
if not row:
row = [r]
result.append(row)
for x in result[0][1:]:
row.append(0)
return row
def find_column_index(result, c):
columns = result[0]
idx = next((idx for idx in range(len(columns)) if columns[idx] == c), None)
if not idx:
columns.append(c)
for row in result[1:]:
row.append(0)
idx = len(columns) - 1
return idx
def test():
#import pdb; pdb.set_trace()
arr = [
[1, "200", 15],
[1, "202", 23],
[2, "200", 9],
[2, "202", 75],
[2, "404", 5]
]
result = process(arr)
print(result)
if __name__ == "__main__":
test()
Pandas可以为您轻松解决这一问题,只需将数据帧传输到数据透视表:
import pandas as pd
df = pd.DataFrame(arr = [
[1, "200", 15],
[1, "202", 23],
[2, "200", 9],
[2, "202", 75],
[2, "404", 5]
],columns = ['h', 'resp', 'count'])
pivot = df.pivot(values='count',index='h',columns='resp')
print(pivot)
您好,我被您对输入数据和输出的描述弄糊涂了:我假设您的输入和输出数据示例在您的注释中写得不正确。您是否希望根据请求类型将输出设置为小时数?i、 e.(hr 1对应202个“200”回复,23个“201”回复,0个“404”回复;hr 2对应9个“200”回复,75个“201”回复等等?@pooh17是的,第一行的最后一列在注释中不正确,在底部的测试数据中是正确的。我现在将编辑我的帖子。你对输出的看法是正确的——每小时对各种响应代码的请求计数这太棒了。是否也可以从原始数据生成最终结果,而这些原始数据是正确的一组
(时间戳,响应代码)
?我需要提取小时数(或计算其他时间段),并需要对它们进行计数,最终设法得到pandas
处理cygwin
。在df.pivot(values='count',index='h',columns='count')上面似乎有一个小错误
应该是df.pivot(values='count',index='h',columns='resp')
。在编辑您的回复之前,我将等待一两天。此外,缺少的值将显示为NaN
,我希望它是0
。我会添加另一条注释并在我弄清楚如何操作后进行编辑哦,我的错了!抱歉是一个输入错误。。。