【问题标题】:pandas groupby plot valuespandas groupby 绘图值
【发布时间】:2019-02-13 14:01:03
【问题描述】:

我有一个看起来像这样的 pandas 数据框:

      **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

我需要将它除以“真实”,然后我需要执行以下操作:

给定 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

然后的想法是,对于 I 和 real 的每个值,在 x 轴上绘制 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 值...

【问题讨论】:

  • 在您的name 中有一个附加列未出现在您提供的示例 tsv 中
  • 现在应该修复(我的错字,deltas 与 weight 相同,t 是一个额外但无用的列)

标签: python pandas matplotlib pandas-groupby


【解决方案1】:

一旦你这样做:

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_values(1) 我得到:IndexError: Too many levels: Index has only 1 level, not 2
  • 您确定您的dfgroupby().sum() 之后的那个,而不是刚刚加载csv 之后的那个吗?我更改了变量名称以使其更清晰。您也可以打印dfdf.index 并将内容添加到您的问题中吗?
  • 是的,我解决了这个问题,但我仍然无法弄清楚如何以我为每个 I 获得一个 SI 向量及其权重的方式实际进行迭代,以便我可以开始绘制它们!跨度>
  • 这样就行了,谢谢。我坚持使用这个解决方案,但我仍然想知道这是否是最“pythonic”的方法!无论如何,我接受你的回答,因为它解决了我的问题
  • 是的,这又快又脏,一个人可能会想出更pythonic的东西,问题是:值得付出努力吗? :-)
猜你喜欢
  • 2020-12-25
  • 2017-01-28
  • 2013-03-06
  • 1970-01-01
  • 2019-02-02
  • 1970-01-01
  • 2021-09-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多