построение столбца данных pandas, который содержит значения NaN - PullRequest
0 голосов
/ 23 мая 2018

У меня возникли проблемы с отображением второго столбца из кадра данных pandas на ось Y-образного двойника.Я думаю, что это может быть потому, что второй проблемный столбец содержит значения NaN.Значения NaN существуют потому, что каждые 10-й год были доступны только данные, хотя для первого столбца были доступны данные каждый год.Они были сгенерированы с использованием np.nan, который я включил в конце для ясности.

Интуиция здесь состоит в том, чтобы построить обе серии на одной оси x, чтобы показать, как они изменяются во времени.

Вот мой код и датафрейм:

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

list1 = ['1297606', '1300760', '1303980', '1268987', '1333521', '1328570', 
         '1328112', '1353671', '1371285', '1396658', '1429247', '1388937', 
         '1359145', '1330414', '1267415', '1210883', '1221585', '1186039', 
         '884273', '861789', '857475', '853485', '854122', '848163', '839226', 
         '820151', '852385', '827609', '825564', '789217', '765651']

list1a = [1980, 1981, 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 
          1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 
          2004, 2005, 2006, 2007, 2008, 2009, 2010]

list3b = [121800016.0, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, 
          145279588.0, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, 
          160515434.5, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, 
          168140487.0]

d = {'Year': list1a,'Abortions per Year': list1, 
     'Affiliation with Religious Institutions': list3b}
newdf = pd.DataFrame(data=d)

newdf.set_index('Year',inplace=True)

fig, ax1 = plt.subplots(figsize=(20,5))

y2min = min(newdf['Affiliation with Religious Institutions'])
y2max = max(newdf['Affiliation with Religious Institutions'])
ax1.plot(newdf['Abortions per Year'])
#ax1.set_xticks(newdf.index)
ax1b = ax1.twinx()
ax1b.set_ylim(y2min*0.8,y2max*1.2)
ax1b.plot(newdf['Affiliation with Religious Institutions'])
plt.show()

Я получаю диаграмму, которая не показывает второй график.(Когда я изменил второй график, чтобы иметь числовые значения для каждого года, он строит его).Вот второй график (со значениями NaN) - игнорируемый:

enter image description here

Благодарен за любой совет.

* как npДля второго столбца были сгенерированы значения .nan: я перебрал по столбцу индекса и для каждого года без данных возвращал np.nan в список, который затем стал столбцом.

for i in range(len(list1a)):
    if list1a[i] in list3a:
        var = list2[j]
        list3b.append(var)

        j+=1
    else:
        var = np.nan
        list3b.append(var)

Ответы [ 4 ]

0 голосов
/ 23 мая 2018

enter image description here Теперь я понимаю.Чтобы добиться этого с вашим существующим кодом, вам просто нужно использовать Pandas forwardfill.

Сразу после

newdf.set_index('Year',inplace=True)

Просто введите

newdf.fillna(method='ffill', inplace=True)
0 голосов
/ 23 мая 2018

В данном случае основная ошибка заключается в том, что вы изображаете точку в виде линии.

list3b = [121800016.0, nan, nan ....... Переход от одной точки к нулю.

Если вы измените второе значение nan на значение: list3b = [121800016.0, 121800016.0, nan, ....., тогда вы увидите результат.enter image description here

Возможно, вам следует отобразить эти значения в виде столбцов или точек разброса.

0 голосов
/ 23 мая 2018

Две вещи.Вам нужно преобразовать столбец Abortions per Year в числовой тип для построения графика, по крайней мере для предоставленных вами данных в формате str;во-вторых, вы можете построить Affiliation with Religious Institutions как линию, отбросив значения nan перед построением.

ax1.plot(newdf['Abortions per Year'].astype(int))

...

ax1b.plot(newdf['Affiliation with Religious Institutions'].dropna())
0 голосов
/ 23 мая 2018

Вы можете использовать pandas DataFrame методы для большинства вещей, которые вы делаете.Эти две строки решат все ваши проблемы:

newdf = newdf.astype(float)
newdf = newdf.interpolate(method='linear')

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

fig, ax1 = plt.subplots(figsize=(20,5))

newdf = newdf.astype(float)
newdf = newdf.interpolate(method='linear')
y2min = newdf['Affiliation with Religious Institutions'].min()
y2max = newdf['Affiliation with Religious Institutions'].max()
newdf['Abortions per Year'].plot.line(ax=ax1)
#ax1.set_xticks(newdf.index)
ax1b = ax1.twinx()
ax1b.set_ylim(y2min*0.8,y2max*1.2)
newdf['Affiliation with Religious Institutions'].plot.line(ax=ax1b)
plt.show()

Использование pandas методов для построения DataFrameэто просто рекомендация.Но вы также можете использовать свой код matplotlib, поскольку pandas использует matplotlib в качестве бэкенда для построения

Две строки, которые я добавил, делают следующее:
Ваш столбец Abortions per Year имеет значение dtype object.Вам необходимо преобразовать это в числовой тип с помощью:

newdf = newdf.astype(float)

Фактически NaN -значения не игнорируются, но не показываются, так как являются единичными значениями.Таким образом, вы можете добавить marker ко второму графику.Если вы хотите показать линию для второго графика, вам необходимо интерполировать значения с помощью:

newdf = newdf.interpolate(method='linear')

Маркеры могут быть удалены, если интерполяция выполнена.

...