Сюжет pandas dataframe, содержащий NaNs

У меня есть данные GPS скорости льда от трех разных приемников GPS. Данные находятся в фрейме pandas с индексом юлианского дня (с начала 2009 года).

Это подмножество данных (основной набор данных - 3487235 строк...):

                    R2          R7         R8
1235.000000 116.321959  100.805197  96.519977
1235.000116 NaN         100.771133  96.234957
1235.000231 NaN         100.584559  97.249262
1235.000347 118.823610  100.169055  96.777833
1235.000463 NaN         99.753551   96.598350
1235.000579 NaN         99.338048   95.283989
1235.000694 113.995003  98.922544   95.154067

Информационная рамка имеет форму:

Index: 6071320 entries, 127.67291667 to 1338.51805556
Data columns:
R2    3487235  non-null values
R7    3875864  non-null values
R8    1092430  non-null values
dtypes: float64(3)

R2 с другой частотой отбирали к R7 и R8, следовательно, NaNs, которые систематически появляются на этом расстоянии.

Попытка df.plot() отобразить весь фрейм данных (или их индексированные расположения строк) отлично работает с точки зрения построения R7 и R8, но не отображает R2. Точно так же выполнение df.R2.plot() также не работает. Единственный способ построения R2 - сделать df.R2.dropna().plot(), но это также удаляет NaNs, которые означают периоды отсутствия данных (а не только более грубую частоту дискретизации, чем другие приемники).

Кто-нибудь еще сталкивался с этим? Любые идеи по этой проблеме были бы с благодарностью получены:)

Ответ 1

Причина, по которой вы не видите ничего, потому что стиль по умолчанию - это только строка. Но линия перегружена в NaN, поэтому будут построены только несколько консекутивных значений. И последнее не происходит в вашем случае. Вам нужно изменить стиль построения, который зависит от того, что вы хотите видеть.

Для начала попробуйте добавить:

.plot(marker='o')

Это должно сделать все точки данных отображаемыми в виде кругов. Он легко становится загроможденным, поэтому может быть полезным корректировка маркеров, edgecolor и т.д. Я не полностью настроен на то, как Pandas использует matplotlib, поэтому я часто переключаюсь на matplotlib сам, если графики усложняются, например:

plt.plot(df.R2.index.to_pydatetime(), df.R2, 'o-')

Ответ 2

Я обнаружил, что даже если df был проиндексирован как DateTime, возникали те же проблемы. Одним из решений, обеспечивающих соблюдение всех точек данных без пропусков между линиями, является построение каждого столбца df отдельно и отбрасывание NaN.

    for col in df.columns:
        plot_data = df[col].dropna()
        ax.plot(plot_data.index.values, plot_data.values, label=col)

Ответ 3

Вот еще один способ:

nan_columns = []
nan_values = []

for column in dataset.columns:
    nan_columns.append(column)
    nan_values.append(dataset[column].isnull().sum())

fig, ax = plt.subplots(figsize=(30,10))
plt.bar(nan_columns, nan_values)