我使用下面的函数用NaN替换了缺少的值:
data = data.applymap(lambda x: np.nan if isinstance(x, basestring) and x.isspace() else x)
,其中data是我正在处理的数据帧。
之后使用seaborn,我尝试使用seaborn.distplot绘制它的一个属性alcconsumption,如下所示:
seaborn.distplot(data['alcconsumption'],hist=True,bins=100)
plt.xlabel('AlcoholConsumption')
plt.ylabel('Frequency(normalized 0->1)')它给了我以下错误:
AttributeError: max must be larger than min in range parameter.发布于 2018-09-10 21:56:40
这是matplotlib/pylab直方图的一个已知问题!
例如,参见https://github.com/matplotlib/matplotlib/issues/6483
在建议各种解决方法的情况下,有两个最受欢迎的解决方法(例如来自https://stackoverflow.com/a/19090183/1021819):
import numpy as np
nbins=100
A=data['alcconsumption']
Anan=A[~np.isnan(A)] # Remove the NaNs
seaborn.distplot(Anan,hist=True,bins=nbins)或者,指定bin边(在这种情况下,无论如何都要使用Anan...):
Amin=min(Anan)
Amax=max(Anan)
seaborn.distplot(A,hist=True,bins=np.linspace(Amin,Amax,nbins))发布于 2019-02-24 16:15:24
可以使用以下行为使用seaborn的分布图选择非NaN值:
seaborn.distplot(data['alcconsumption'].notnull(),hist=True,bins=100)发布于 2018-06-19 20:18:15
我肯定会在你绘制数据之前先处理遗漏的值。是否不使用dropna()完全取决于您的数据集的性质。alcconsumption是单个系列还是数据帧的一部分?在后一种情况下,使用dropna()也会删除其他列中的相应行。缺少的值是少还是多?它们是在您的系列中传播的,还是倾向于以组的形式出现?是否有理由相信您的数据集中存在趋势?
如果缺少的值很少且分散,您可以很容易地使用dropna()。在其他情况下,我会选择用之前观察到的值(1)来填充缺少的值。或者甚至用内插值来填充缺失值(2)。但是要小心!用填充或插值的观测值替换大量数据可能会严重中断您的数据集,并导致非常错误的结论。
下面是一些使用您的代码片段的示例。
seaborn.distplot(data['alcconsumption'],hist=True,bins=100)
plt.xlabel('AlcoholConsumption')
plt.ylabel('Frequency(normalized 0->1)')..。在合成数据集上:
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
def sample(rows, names):
''' Function to create data sample with random returns
Parameters
==========
rows : number of rows in the dataframe
names: list of names to represent assets
Example
=======
>>> sample(rows = 2, names = ['A', 'B'])
A B
2017-01-01 0.0027 0.0075
2017-01-02 -0.0050 -0.0024
'''
listVars= names
rng = pd.date_range('1/1/2017', periods=rows, freq='D')
df_temp = pd.DataFrame(np.random.randint(-100,100,size=(rows, len(listVars))), columns=listVars)
df_temp = df_temp.set_index(rng)
return df_temp
df = sample(rows = 15, names = ['A', 'B'])
df['A'][8:12] = np.nan
df输出:
A B
2017-01-01 -63.0 10
2017-01-02 49.0 79
2017-01-03 -55.0 59
2017-01-04 89.0 34
2017-01-05 -13.0 -80
2017-01-06 36.0 90
2017-01-07 -41.0 86
2017-01-08 10.0 -81
2017-01-09 NaN -61
2017-01-10 NaN -80
2017-01-11 NaN -39
2017-01-12 NaN 24
2017-01-13 -73.0 -25
2017-01-14 -40.0 86
2017-01-15 97.0 60(1)通过pandas.DataFrame.fillna(method = ffill)使用正向填充
ffill将“向前填充值”,这意味着它将用上面行的值替换nan。
df = df['A'].fillna(axis=0, method='ffill')
sns.distplot(df, hist=True,bins=5)
plt.xlabel('AlcoholConsumption')
plt.ylabel('Frequency(normalized 0->1)')

(2)通过pandas.DataFrame.interpolate()使用插值
根据不同的方法插入值。时间插值对每日和更高分辨率的数据进行插值,以插值给定的间隔长度。
df['A'] = df['A'].interpolate(method = 'time')
sns.distplot(df['A'], hist=True,bins=5)
plt.xlabel('AlcoholConsumption')
plt.ylabel('Frequency(normalized 0->1)')

正如您所看到的,不同的方法呈现了两个非常不同的结果。我希望这能对你有所帮助。如果没有,请让我知道,我会再看一遍。
https://stackoverflow.com/questions/32902832
复制相似问题