2017-01-16 112 views
-3

我是Python的新手,我有一个问题。我从CSV文件加载数据,删除重复项,保存已删除的复制csv文件,然后加载正确的CSV文件并生成图形。然而,我的问题是,图表没有正确显示,因为总数是错误的。我知道该程序工作正常,因为如果我删除第1部分(请参阅下面的#section1),我得到正确的数据显示。我无法看到第1部分中的内容会导致数据偏差......任何帮助都将不胜感激。谢谢。Python - 数据显示不正确(Matplotlib)

摘要:无法在同一个py文件中运行第1部分和第2部分,否则数据会错误地计入。想知道为什么?如何避免它而不运行单独的py文件。

from collections import Counter 
import numpy as np 
import matplotlib 
import matplotlib.pyplot as plt 
import pandas as pd 
import csv 
import itertools 

第1

# Create database of duplicates - check if the mac and os pairs have  duplicates 
reader = csv.reader(open('Workbook1.csv', 'r'), delimiter=',') 
writer = csv.writer(open('remacos.csv', 'w'), delimiter=',') 
entries = set() 

for row in reader: 
key = (row[1], row[2]) 

if key not in entries: 
    writer.writerow(row) 
    entries.add(key) 

entries.clear() 
# Create database of duplicates - check if the mac and browser pairs  have duplicates 
reader = csv.reader(open('Workbook1.csv', 'r'), delimiter=',')  
writer = csv.writer(open('remacbrowser.csv', 'w'), delimiter=',') 
entries = set() 

for row in reader: 
key = (row[1], row[3]) 

if key not in entries: 
    writer.writerow(row) 
    entries.add(key) 

第2节

# Read Removed Duplicated entries Database and Count Values for OS. 
df = pd.read_csv('remacos.csv', index_col="mac")   
counteros = Counter(df['os']) 
os_names = counteros.keys() 
os_counts = counteros.values() 

# Read Removed Duplicated entries Database and Count Values for  Browsers. 
df = pd.read_csv('remacbrowser.csv', index_col="mac")   
counterbrowsers = Counter(df['browser']) 
browser_names = counterbrowsers.keys() 
browser_counts = counterbrowsers.values() 

创建2个条形图和饼图

# Plot histogram using matplotlib bar() for OS. 
indexes = np.arange(len(os_names)) 
width = 0.7 
plt.bar(indexes, os_counts, width) 
plt.xticks(indexes + width * 0.5, os_names) 
plt.show() 

# Plot histogram using matplotlib bar() for Browsers. 
indexes = np.arange(len(browser_names)) 
width = 0.7 
plt.bar(indexes, browser_counts, width) 
plt.xticks(indexes + width * 0.5, browser_names) 
plt.show() 

# Make Pie Chart for OS's 
plt.figure() 
values = os_counts 
labels = os_names 
def make_autopct(values): 
def my_autopct(pct): 
total = sum(values) 
val = int(round(pct*total/100.0)) 
return '{p:.2f}% ({v:d})'.format(p=pct,v=val) 
return my_autopct 
plt.pie(values, labels=labels, autopct=make_autopct(values)) 
#plt.pie(values, labels=labels) #autopct?? 
plt.show() 
# Make Pie Chart for Browsers 
plt.figure() 
values = browser_counts 
labels = browser_names 
def make_autopct(values): 
def my_autopct(pct): 
total = sum(values) 
val = int(round(pct*total/100.0)) 
return '{p:.2f}% ({v:d})'.format(p=pct,v=val) 
return my_autopct 
plt.pie(values, labels=labels, autopct=make_autopct(values)) 
#plt.pie(values, labels=labels) #autopct?? 
plt.show()' 
+1

“图表没有被正确显示”不是一个足够的问题描述。正如你所说的,在使用原始文件时,绘图效果很好,问题与“section1”有关,因此所有的“section2”对这个问题都没有用处。相反,尝试使用csv文件中的几条数据线来创建[MCVE]。尝试比较“section1”的输出和你的期望。此外,清楚地说明您期望的问题,并更正for循环中的缩进代码。 – ImportanceOfBeingErnest

+0

这整个事情是完整的程序,我想说的是,如果我从.py文件中删除第1部分,我会得到显示正确计数的图表。当我包括第1部分时,如果这有意义,我可以得到更低的计数。例如,当饼图上的displayd为221时HandHeld浏览器的计数为240,但如果我从脚本中删除第一部分,但在同一个脚本中同样喜欢它们,则会得到正确的数字。所以出于某种原因,第1部分正在歪曲计数 – user2273231

回答

-1

溶液添加“德尔writer'after每个创建重复数据库