Python 按绘图值分组

Python 按绘图值分组,python,pandas,matplotlib,pandas-groupby,Python,Pandas,Matplotlib,Pandas Groupby,我有一个熊猫数据框,看起来像这样: **real I SI weights** 0 1 3 0.3 0 2 4 0.2 0 1 3 0.5 0 1 5 0.5 1 2 5 0.3 1 2 4

我有一个熊猫数据框,看起来像这样:

      **real    I     SI     weights**
        0       1     3      0.3  
        0       2     4      0.2
        0       1     3      0.5
        0       1     5      0.5

        1       2     5      0.3  
        1       2     4      0.2
        1       1     3      0.5
我需要将其除以“real”,然后我需要执行以下操作:

给定i的值,考虑SI的每个值并增加总重量。最后,对于每一次实现,我应该有这样的东西:

    real = 0:
             I = 1     SI = 3      weight = 0.8
                       SI = 5      weight = 0.5

             I = 2     SI = 4      weight = 0.2

    real = 1:  
             I = 1     SI = 3      weight = 0.5

             I = 2     SI = 5      weight = 0.3
                       SI = 4      weight = 0.2
然后,在x轴上绘制I和real的每个值的SI值,在y轴上绘制相对总权重(归一化为1)

我想做的是:

       name = ['I', 'SI','weight', 'real']
       Location = 'Simulationsdata/prova.csv'
       df = pd.read_csv(Location, names = name,sep='\t',encoding='latin1') 

       results = df.groupby(['I', 'real', 'SI']).weight.sum()
当我打印结果时,我得到了我想要的表格,但现在我不知道如何按照我想要的方式进行绘图,因为我不知道如何获得SI值…

一旦您这样做:

results = df.groupby(['real', 'I', 'SI'])['weights'].sum()
您可以通过使用获取存储在数据帧中的
'real'
'I'
'SI'
的值

results.index.get_level_values(0)
Int64Index([0, 0, 0, 1, 1, 1], dtype='int64', name='real'
results.index.get_level_values(1)
Int64Index([1, 1, 2, 1, 2, 2], dtype='int64', name=' I')
results.index.get_level_values(2)
Int64Index([3, 5, 4, 3, 4, 5], dtype='int64', name=' SI')
你可以迭代这些来得到你想要的图。例如:

import matplotlib.pyplot as plt
fig, axes = plt.subplots(2, 2)

for idx1, i in enumerate(results.index.get_level_values(0).unique()):
    for idx2, j in enumerate(results.index.get_level_values(1).unique()):
        axes[idx1, idx2].plot(results.loc[i, j], 'o')
        axes[idx1, idx2].set_xlabel('SI')
        axes[idx1, idx2].set_ylabel('weights')
        axes[idx1, idx2].set_xlim([0, 6])
        axes[idx1, idx2].set_ylim([0, 1])
        axes[idx1, idx2].set_title('real: {} I: {}'.format(i, j))

plt.tight_layout()
plt.show()


当我尝试打印df.index.get_level_值时(1)我获得:indexer错误:级别太多:index只有1个级别,而不是2您确定您的
df
是在
groupby().sum()之后的,而不是刚刚加载csv之后的?我更改了变量名以使其更清晰。你还可以打印
df
df.index
并将内容添加到你的问题中吗?是的,我已经解决了这个问题,但我仍然无法确定如何实际进行迭代,以获得每个I的SI向量及其权重,这样我就可以开始绘制它们了!那就行了,谢谢你。我坚持这个解决方案,但我仍然怀疑这是否是最“pythonic”的方法!无论如何,我接受你的答案,因为它解决了我的问题是的,这是快速和肮脏的,一个人可能会想出一些更python的,问题是:它值得努力吗?:-)在您的
名称中
有一个额外的列没有出现在示例tsv中,您需要修复它(我的打字错误,delta与weight相同,t是一个额外但无用的列)