Многоиндексация и построение графиков с использованием pandas

#pandas #plot #multi-index

#pandas #построение графика #многоиндексный

Вопрос:

Я хотел бы отобразить этот фрейм данных pandas в виде трех 2D строк: no_transfer, transfer и random_transfer, где каждая соответствующая строка относится к столбцам от 0 до 9. Фрейм данных имеет многоиндекс. Я также хотел бы избавиться от уровня «is_greedy», поскольку значение одинаково для всех.

                               0    1     2     3  ...      6     7     8     9
config          is_greedy                         ...                         
no_transfer     True        9.0  9.0  14.0  15.0  ...   16.5  15.0  11.0   9.5
transfer        True        9.0  9.5  27.5  10.5  ...   19.5  55.5  14.0  24.0
random_transfer True       35.5  9.0  13.5  10.0  ...   10.0  13.0  27.5  32.0
  

Ответ №1:

Отбросьте уровень индекса, транспонируйте и постройте график.

 df.reset_index('is_greedy', drop=True).T.plot()
  

Примеры данных

 import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randint(30, 50, (3, 11)), 
                  index=['no_transfer', 'transfer', 'random_transfer'])
df = df.set_index(10, append=True)
df.index.names=['config', 'is_greedy']
#                            0   1   2   3   4   5   6   7   8   9
#config          is_greedy                                        
#no_transfer     40         35  49  47  36  48  47  39  48  38  32
#transfer        33         35  33  45  38  38  45  36  30  46  36
#random_transfer 36         32  41  36  41  37  35  40  42  49  32

df.reset_index('is_greedy', drop=True).T.plot()
  

введите описание изображения здесь


Или выполните итерацию по строкам:

 import matplotlib.pyplot as plt

fig, ax = plt.subplots()
for idx, row in df.iterrows():
    ax.plot(df.columns, row, label=idx[0])
plt.legend()
plt.show()