pandasシリーズのオブジェクトからヒストグラムを作成するのに問題があり、なぜ機能しないのか理解できません。コードは以前は正常に機能していましたが、現在は機能しません。
これが私のコードの一部です(具体的には、ヒストグラムを作成しようとしているpandasシリーズオブジェクト):
type(dfj2_MARKET1['VSPD2_perc'])
結果を出力します:pandas.core.series.Series
プロットコードは次のとおりです。
fig, axes = plt.subplots(1, 7, figsize=(30,4))
axes[0].hist(dfj2_MARKET1['VSPD1_perc'],alpha=0.9, color='blue')
axes[0].grid(True)
axes[0].set_title(MARKET1 + ' 5-40 km / h')
エラーメッセージ:
AttributeError Traceback (most recent call last)
<ipython-input-75-3810c361db30> in <module>()
1 fig, axes = plt.subplots(1, 7, figsize=(30,4))
2
----> 3 axes[1].hist(dfj2_MARKET1['VSPD2_perc'],alpha=0.9, color='blue')
4 axes[1].grid(True)
5 axes[1].set_xlabel('Time spent [%]')
C:\Python27\lib\site-packages\matplotlib\axes.pyc in hist(self, x, bins, range, normed, weights, cumulative, bottom, histtype, align, orientation, rwidth, log, color, label, stacked, **kwargs)
8322 # this will automatically overwrite bins,
8323 # so that each histogram uses the same bins
-> 8324 m, bins = np.histogram(x[i], bins, weights=w[i], **hist_kwargs)
8325 m = m.astype(float) # causes problems later if it's an int
8326 if mlast is None:
C:\Python27\lib\site-packages\numpy\lib\function_base.pyc in histogram(a, bins, range, normed, weights, density)
158 if (mn > mx):
159 raise AttributeError(
--> 160 'max must be larger than min in range parameter.')
161
162 if not iterable(bins):
AttributeError: max must be larger than min in range parameter.
このエラーは、特にシリーズにNaN値がある場合に発生します。そうだろうか?
これらのNaNは、matplotlibのhist
関数ではうまく処理されません。例えば:
s = pd.Series([1,2,3,2,2,3,5,2,3,2,np.nan])
fig, ax = plt.subplots()
ax.hist(s, alpha=0.9, color='blue')
同じエラーを生成しますAttributeError: max must be larger than min in range parameter.
1つのオプションは、たとえば、プロットする前にNaNを削除することです。これは動作します:
ax.hist(s.dropna(), alpha=0.9, color='blue')
別のオプションは、シリーズでpandas hist
メソッドを使用し、ax
キーワードにaxes[0]
を指定することです。
dfj2_MARKET1['VSPD1_perc'].hist(ax=axes[0], alpha=0.9, color='blue')
エラーは、上記のNaN
値が原因です。ただ使用する:
df = df['column_name'].apply(pd.to_numeric)
値が数値でない場合に適用される場合:
df = df['column_name'].replace(np.nan, your_value)