У сюжета Python Pandas есть пробелы при использовании разреженного фрейма данных

Когда я пытаюсь построить следующие данные

import pandas as pd
dfx = pd.DataFrame()
dfx['bing'] = [1,2,3,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan]
dfx['bang'] = [np.nan,np.nan,np.nan,4,5,6,np.nan,np.nan,np.nan]
dfx['boo'] = [np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,7,8,9]
dfx.plot()
plt.show()

Я получаю эту строку с пробелами. Я хочу иметь возможность использовать разные цвета для разных сегментов моей линии, но также хотел бы, чтобы они были «связаны».


56
1

Ответ:

Решено

Две возможные идеи:

Вариант 1: Используйте df.fillna:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

dfx = pd.DataFrame()
dfx['bing'] = [1,2,3,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan]
dfx['bang'] = [np.nan,np.nan,np.nan,4,5,6,np.nan,np.nan,np.nan]
dfx['boo'] = [np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,7,8,9]

dfx.fillna(method='bfill', axis=1).plot()
plt.show()

# i.e. we're plotting:

array([[ 1., nan, nan],
       [ 2., nan, nan],
       [ 3., nan, nan],
       [ 4.,  4., nan],
       [ 5.,  5., nan],
       [ 6.,  6., nan],
       [ 7.,  7.,  7.],
       [ 8.,  8.,  8.],
       [ 9.,  9.,  9.]])

Результат:

Вариант 2: добавьте линию для соединения других линий

Немного больше работы (хотя может быть более быстрый способ построить линию «соединителя», чем подход, который я использую здесь). Добавьте столбец, соединяющий конец одной строки с началом следующей. Например.:

dfx = pd.DataFrame()
dfx['bing'] = [1,2,3,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan]
dfx['bang'] = [np.nan,np.nan,np.nan,4,5,6,np.nan,np.nan,np.nan]
dfx['boo'] = [np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,7,8,9]

# get index vals end-start: array([2, 3, 5, 6], dtype=int64)
s = dfx.apply(lambda col: (col.first_valid_index(), 
                           col.last_valid_index()))\
    .stack().sort_values().to_numpy()[1:-1]

# create extra col with connection btw consecutive lines
dfx['connect'] = dfx.fillna(method='ffill', axis=1).iloc[:,-1]\
    .mask(~dfx.index.isin(s))

# print(dfx.connect.to_numpy())
# [nan nan  3.  4. nan  6.  7. nan nan]

fig, ax = plt.subplots(figsize=(12,8))

colors = ['blue','orange','green','black']
for i, col in enumerate(dfx.columns):
    if col == 'connect':
        # add `label=col` if you want "connect" in the legend as well
        ax.plot(dfx[col], colors[i], linestyle='dotted')
    else:
        ax.plot(dfx[col], colors[i], label=col)
ax.legend()
plt.show()

Результат:


Интересные вопросы для изучения

Вызов метода аутентификации Monogdb / pymongo завершается неудачно, поскольку такого метода не существуетКак я могу найти элементы, которых нет в исходном коде страницы, используя селен (питон)Отрегулируйте высоту подзаговора с 1 строкой и 2 столбцамиМаксимальное значение в максимальной куче не является правильным значениемКак рассчитать процентное значение числа в столбце фрейма данных, сгруппированном по индексуКак создать лямбда-функцию для суммирования значений фрейма данных на основе критериев и наличия в спискеТранспонировать фрейм данных с ячейками как сумму по столбцамКак рассчитать итоги всех возможных комбинаций столбцовВычислить разницу в днях с ближайшими строками с определенным условием, используя PandasКак рассчитать процентное значение числа в столбце фрейма данных, сгруппированном по индексу