【问题标题】:Python histogram from unsorted data来自未排序数据的 Python 直方图
【发布时间】:2014-12-03 16:03:19
【问题描述】:

我正在尝试解析一些数据以生成直方图

数据在多列中,但对我来说唯一相关的列是下面的两列。

X

AB    42

CD    77

AB    33

AB    42

AB    33

CD    54

AB    33

仅对于带有 AB 的行,我想绘制 col 2 中值的直方图。所以直方图应该排序和绘制:

33 - 3

42 - 2

(虽然 42 先出现,但我想先绘制 33)。

我有很多列,但它需要 grep 'AB' 字符并且只在这些行中搜索。有人可以帮忙吗?

更新:数据在一个 csv 文件中,并且有几列。

编辑:我现在有这种格式的 csv 文件中的数据。

地址、数据

来自AP,42

来自AP,42

来自AP,33

ToAP,77

来自AP,54

来自AP,42

来自AP,42

来自AP,33

ToAP,42

来自AP,42

来自AP,33

如果我使用来自@dranxo 的代码,

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv('data.csv', sep=',')

df_useful = df[df['Addresses'] == 'FromAP']

df_useful.hist()
plt.show()

我收到以下错误:

Laptop@ubuntu:~/temp$ ./a.py
/usr/lib/pymodules/python2.7/matplotlib/axes.py:8261: UserWarning: 2D hist input should be nsamples x nvariables;
 this looks transposed (shape is 0 x 1)
  'this looks transposed (shape is %d x %d)' % x.shape[::-1])
Traceback (most recent call last):
  File "./a.py", line 11, in <module>
    df_useful.hist()
   File "/usr/lib/python2.7/dist-packages/pandas/tools/plotting.py", line 2075, in hist_frame
    ax.hist(data[col].dropna().values, **kwds)
  File "/usr/lib/pymodules/python2.7/matplotlib/axes.py", line 8312, in hist
    xmin = min(xmin, xi.min())
  File "/usr/lib/python2.7/dist-packages/numpy/core/_methods.py", line 21, in _amin
    out=out, keepdims=keepdims)
ValueError: zero-size array to reduction operation minimum which has no identity

我确实安装了 pandas 包、numpy、matplotlib。 谢谢

【问题讨论】:

  • 数据在哪里?文本文件?
  • 是的。在 csv 或制表符分隔的文件中。而且它是一个大文件……大约有 10 万个条目。
  • @mane 请更新您的问题以指定数据为 CSV 格式。让未来的读者比解析您的评论更容易。在问题中提及您迄今为止尝试过的内容也很有帮助。 stackoverflow.com/help/how-to-ask

标签: python


【解决方案1】:

你有没有看过pandas

以下是解析数据并绘制几行的方法:

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv('data.ssv', sep=' ')

df_useful = df[df['letters'] == 'AB']

df_useful.hist()
plt.show()

注意:在调用pd.read_csv 之前,我已将您的数据保存到名为“data.ssv”的文件中。这是那个文件:

字母数字

AB 42

CD 77

AB 33

AB 42

AB 33

CD 54

AB 33

编辑:要检查问题不在于数据,您可以运行以下代码:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

df = pd.DataFrame(np.round(np.random.randn(10, 2)),
                 columns=['a', 'b'])

df.hist()
plt.show()

【讨论】:

  • 我在看 pandas lib,它看起来很酷,有很多方法。感谢您提供漂亮而简短的代码。
  • 当然。顺便说一句,在 pd.read_csv
  • 我无法阅读评论中的代码/数据。你可以编辑你的问题吗?
  • 嗨@dranxo,我使用了你的代码并将分隔符更改为','该文件有
    地址,数据来自AP,42 FromAP,42 FromAP,33 ToAP,77 FromAP, 54 FromAP,42 FromAP,42 FromAP,33 ToAP,42 FromAP,42 FromAP,33 <pre> 我看到以下错误:</pre>
  • /usr/lib/pymodules/python2.7/matplotlib/axes.py:8261: UserWarning: 2D hist input should be nsamples x nvariables;这看起来转置了(形状为 0 x 1)'这看起来转置了(形状为 %dx %d)'% x.shape[::-1]) 回溯(最后一次调用):文件“./a.py” ,第 11 行,在 df_useful.hist() 文件“/usr/lib/python2.7/dist-packages/pandas/tools/plotting.py”,第 2075 行,在 hist_frame ax.hist(data[col] .dropna().values, **kwds)
【解决方案2】:

我想数据在file.csvAB 在第一列,42 在第二列

import csv
reader = csv.reader(open('file.csv', 'r'))
dic = {}
for row in reader:
    if row[0] == 'AB':
        value = int(row[1])
        if  value in dic.keys():
            dic[value] += 1
        else:
            dic[value] = 1

#sorted print 
for key in sorted(dic):
    print '%s-%s'%(key, dic[key])

【讨论】:

  • 假设我有几列,我只对列标题为“发件人”和“值”的这两列感兴趣。如何仅将这两个值提取到字典中?
  • 您可以按列的编号访问列,如列表项。从zero算起。
【解决方案3】:

以下代码示例将起作用。请注意,阅读 CSV 在您的情况下可能会有所不同,具体取决于其确切格式。 See this question 用于读取 CSV。

import csv
with open("/tmp/test.csv", "r") as f:
    #Filter the result for "AB" as we read the lines from the file
    filtered_result = [tuple(line) for line in csv.reader(f) if line[0] == "AB"]

#Now, sort the result by the second column
final_result = sorted(filtered_result,key=lambda x: x[1])

#Print it for inspection
for key, value in final_result:
    print "key: %s, value: %s" % (key, value)

输出:

key: AB, value: 33
key: AB, value: 33
key: AB, value: 33
key: AB, value: 42
key: AB, value: 42

/tmp/test.csv 的内容:

AB,42
CD,77
AB,33
AB,42
AB,33
CD,54
AB,33

我用 100,000 行随机数据填充了 /tmp/test.csv,下面是我的脚本需要多长时间:

$ time python test.py 

real    0m0.073s
user    0m0.073s
sys 0m0.000s

编辑:更新以获得更好的性能并显示 CSV 示例
编辑:再次更新以更快

【讨论】:

    【解决方案4】:

    有两个不同的问题:

    1. 解析 CSV - Python 有一个 inbuilt library for CSV
    2. 绘制结果 - 您的 Python 程序是否需要生成直方图?还是可以将解析后的 CSV 放入某个电子表格软件并在那里进行处理?

    如果您必须让 Python 程序生成直方图,那么这里有一个 list of graphing libraries 可以帮助您入门。

    【讨论】:

      猜你喜欢
      • 2020-10-19
      • 2014-04-26
      • 2014-01-24
      • 2019-11-09
      • 2012-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多