Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将n*3矩阵转换为n*m矩阵_Python_Python 3.x - Fatal编程技术网

Python 将n*3矩阵转换为n*m矩阵

Python 将n*3矩阵转换为n*m矩阵,python,python-3.x,Python,Python 3.x,对于web服务器,我试图生成一个报告,给出在某个固定持续时间内(例如一小时)具有各种响应代码的请求数 根据原始http访问日志数据,我首先生成了一个数组数组,其中每行有3个单元格:小时、响应代码和请求数。然后从中生成最终结果。逻辑非常简单,对于输入中的每一行 我有它的工作,看到小样本,但它似乎并不“pythonic”,我想知道是否有更好的方法来做它。我有Python的初学者技能,没有接触过各种数据处理库 有更好的方法吗?是否有任何库可用于直接从初始原始数据生成最终结果 另外,我很确定转置不是这个

对于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
。我会添加另一条注释并在我弄清楚如何操作后进行编辑哦,我的错了!抱歉是一个输入错误。。。