панды групповые сюжетные значения - PullRequest
0 голосов
/ 08 сентября 2018

У меня есть датафрейм панд, который выглядит следующим образом:

      **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 и действительного значения на оси 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 ...

1 Ответ

0 голосов
/ 08 сентября 2018

Как только вы сделаете это:

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()

что дает

subplots over real, I values

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...