Булева маска используется для разделения данных, но при построении диаграммы matplotlib возвращает: «ValueError: Истинное значение DataFrame неоднозначно ...» - PullRequest
0 голосов
/ 10 сентября 2018

Это небольшой фрагмент моего исходного большого (7000+ рядов) фрейма данных, проиндексированного по дате, со столбцами для размера наводнения (Размер) и количества осадков (ppt):

                Size    ppt
date
2017-09-11      0.0     0.000000
2017-09-12      0.0     0.000000
2017-09-13      0.0     0.000000
2017-09-14      1.0     34.709998
2017-09-15      0.0     0.000000
2017-09-16      0.0     0.000000
2017-09-17      0.0     0.000000
2017-09-18      0.0     0.600000
2017-09-19      3.0     157.439998

Я использовал приведенный ниже код, чтобы разбить его на группы, которые я хочу сравнить: «Дождь в дни наводнения (когда Размер = 1,2 или 3, ppt> = 0)», «Дождь в дни без наводнения (размер = 0, ppt> 0), а затем удаляются дни, когда не было дождей или наводнений (размер = 0, ppt = 0).

#initial separation of data

mask = df1['Size'].eq(0)
dfFl = df1[~mask] #Days with floods
dfnFl = df1[mask] #Days without floods i.e Size=0

# remove days with no rain or flood.

mask = df1['ppt3'].eq(0)
dfnFl = df1[~mask] #Days with rain but no flood
dfnil = df1[mask] #Days with no flood or rain

Используя этот фрагмент моего фрейма данных, этот процесс возвращает:

#dfFl (days with flood):
                Size    ppt
date
2017-09-14      1.0     34.709998
2017-09-19      3.0     157.439998

#dfnFl (days with rainfall but no flood):
                Size    ppt
date
2017-09-18      0.0     0.600000

#dfnil (days with no rain nor flood):
                Size    ppt
date
2017-09-11      0.0     0.000000
2017-09-12      0.0     0.000000
2017-09-13      0.0     0.000000
2017-09-15      0.0     0.000000
2017-09-16      0.0     0.000000
2017-09-17      0.0     0.000000
2017-09-18      0.0     0.600000

Я хочу сравнить эти группы (dfFl и dfnFl), просматривая их в виде простого прямоугольника:

fig, axs = plt.subplots(2, 3)
axs[0, 0].boxplot(dfFl['ppt'], dfnFl['ppt'])
plt.show()

Однако, когда я пытаюсь это сделать, я получаю следующую ошибку:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-39-2b9c443a4940> in <module>()
      2
      3 fig, axs = plt.subplots(2, 3)
----> 4 axs[0, 0].boxplot(dfFl['ppt'], dfnFl['ppt'])
      5 plt.show()

~/anaconda3/lib/python3.6/site-packages/matplotlib/__init__.py in inner(ax, 
*args, **kwargs)
   1708                     warnings.warn(msg % (label_namer, func.__name__),
   1709                                   RuntimeWarning, stacklevel=2)
-> 1710             return func(ax, *args, **kwargs)
   1711         pre_doc = inner.__doc__
   1712         if pre_doc is None:

~/anaconda3/lib/python3.6/site-packages/matplotlib/axes/_axes.py in 
boxplot(self, x, notch, sym, vert, whis, positions, widths, patch_artist, 
bootstrap, usermedians, conf_intervals, meanline, showmeans, showcaps, showbox, 
showfliers, boxprops, labels, flierprops, medianprops, meanprops, capprops, 
whiskerprops, manage_xticks, autorange, zorder)
   3443                            meanline=meanline, showfliers=showfliers,
   3444                            capprops=capprops, whiskerprops=whiskerprops,
-> 3445                            manage_xticks=manage_xticks, zorder=zorder)
   3446         return artists
   3447 

~/anaconda3/lib/python3.6/site-packages/matplotlib/axes/_axes.py in bxp(self, 
bxpstats, positions, widths, vert, patch_artist, shownotches, showmeans, 
showcaps, showbox, showfliers, boxprops, whiskerprops, flierprops, medianprops, 
capprops, meanprops, meanline, manage_xticks, zorder)
   3773 
   3774             # notched boxes
-> 3775             if shownotches:
   3776                 box_x = [box_left, box_right, box_right, cap_right, 
box_right,
   3777                          box_right, box_left, box_left, cap_left, 
box_left,

~/anaconda3/lib/python3.6/site-packages/pandas/core/generic.py in 
__nonzero__(self)
    953         raise ValueError("The truth value of a {0} is ambiguous. "
    954                          "Use a.empty, a.bool(), a.item(), a.any() or 
a.all()."
--> 955                          .format(self.__class__.__name__))
    956 
    957     __bool__ = __nonzero__
ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), 
a.item(), a.any() or a.all().

Я не совсем понимаю, что здесь происходит не так, поскольку, когда я просматриваю отфильтрованные кадры данных, они выглядят нормально (как показано выше). Есть идеи?

Спасибо

1 Ответ

0 голосов
/ 10 сентября 2018

boxplot ожидает один аргумент x (axs[0, 0].boxplot(x)). Однако вы приводите два аргумента. Это, конечно, потерпит неудачу, потому что второй аргумент интерпретируется как уточняющий, если должны быть показаны метки, и поэтому должен принимать либо True, либо False.

Похоже, что вместо этого вы хотите построить два боксплота,

axs[0, 0].boxplot(dfFl['ppt'])
axs[0, 0].boxplot(dfnFl['ppt'])

или

axs[0, 0].boxplot([dfFl['ppt'],dfnFl['ppt']])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...