我正在寻求一些关于如何最好地自动化循环以创建由dict进行的一些计算的图形可视化的指导。
我将以下代码拼凑在一起以创建单个图形,但需要生成许多相似的图形(使用不同的变量),而不是多次输出每个变量(将有100个变量)。
对于单个图,我有以下代码(见下文),其中Calclist是一个字典,而variable1是该字典中的特定列:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
Sets = {}
labels = ['0 - 5','5 - 25','25 - 50','50 - 75','75 - 100']
blocks = [-1,5,25,50,75,100]
for i in Calclist:
out = pd.cut(Calclist[i]['variable1'], bins = blocks)
Sets[i] = (pd.value_counts(out)/Calclist[i]['variable1'].count())*100
df = pd.DataFrame(Sets)
df.reset_index(level=0, inplace=True)
df.rename(index = str, columns = {'index':'blocks'}, inplace=True)
ax = df.plot.bar(title='One iteration - works well')
ax.set_xlabel("x-axis label")
ax.set_ylabel("y-axis label")
ax.set_xticklabels(labels, rotation=45)
到目前为止,非常好 - 这就是代码将产生的内容:
我真正想做的是迭代变量1(变量2,变量3,......)。
我尝试了几件事,并且认为我已经接近但可能缺少一些基本的东西。
具体来说,我尝试使用"参数"嵌套另一个迭代系列的循环,它包含我对可视化感兴趣的变量名称:
Sets = {}
labels = ['0 - 5','5 - 25','25 - 50','50 - 75','75 - 100']
blocks = [-1,5,25,50,75,100]
Parameter = pd.Series("variable1","variable2")
for j in Parameter:
for i in Calclist:
out = pd.cut(Calclist[i][Parameter[j]], bins = blocks)
Sets[i] = (pd.value_counts(out)/Calclist[i]
[Parameter[j]].count())*100
但是我收到以下错误:
TypeError: Index(...) must be called with a collection of some kind,
'powertotal_total' was passed
非常感谢任何和所有建议。
答案 0 :(得分:0)
你不能以这种方式迭代大熊猫系列。 试试
for j in ["variable1","variable2"]:
或其中的一些变体
编辑:或查找如何迭代大熊猫系列 http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.iteritems.html
答案 1 :(得分:0)
您的错误消息是由初始化Parameters
:
parameter = pd.Series('variable1', 'variable2')
...
TypeError: Index(...) must be called with a collection of some kind,
'variable2' was passed
您必须将数组,字典或标量值传递给pd.Series
。此外,迭代Parameters
将返回其值。最后,您应该为每个Sets
初始化parameter
:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
labels = ['0 - 5','5 - 25','25 - 50','50 - 75','75 - 100']
blocks = [-1,5,25,50,75,100]
Parameters = pd.Series(['variable1', 'variable2'])
for parameter in Parameters:
Sets = {}
for i in Calclist:
out = pd.cut(Calclist[i][parameter], bins = blocks)
Sets[i] = (pd.value_counts(out)/Calclist[i][parameter].count())*100
df = pd.DataFrame(Sets)
df.reset_index(level=0, inplace=True)
df.rename(index=str, columns={'index': 'blocks'}, inplace=True)
ax = df.plot.bar(title=parameter)
ax.set_xlabel("x-axis label")
ax.set_ylabel("y-axis label")
ax.set_xticklabels(labels, rotation=45)