Сюжет 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)