这已在前面讨论过,但答案相互矛盾:
我想知道的是:
inplace = False默认行为?inplace = True?inplace = True操作是否"真正"就地进行?inplace参数,总是默认为False,意味着原始的DataFrame不受影响,并且操作返回一个新的DF.inplace = True,操作可能适用于原始DF,但它可能仍在幕后复制,只需在完成后重新分配参考.inplace = False:df.dropna().rename().sum()...这很好,并提供延迟评估或更有效的重新排序的机会(虽然我不认为Pandas正在这样做).inplace = True在可能是底层DF的切片/视图的对象上使用时,Pandas必须进行SettingWithCopy检查,这是昂贵的.inplace = False避免这种情况.inplace = True:reset_index()运行速度快两倍,并使用峰值内存的一半!).因此,inplace = True除了专门编写链式语句之外,将copy-vs-view问题放在一边,总是使用它似乎更高效.但这不是默认的熊猫选择,所以我错过了什么?
我有一个pandas数据帧,其中包含一些我希望zscore规范化的实数值:
>> a
array([ nan, 0.0767, 0.4383, 0.7866, 0.8091, 0.1954, 0.6307,
0.6599, 0.1065, 0.0508])
>> df = pandas.DataFrame({"a": a})
Run Code Online (Sandbox Code Playgroud)
问题是单个nan值会产生所有数组nan:
>> from scipy.stats import zscore
>> zscore(df["a"])
array([ nan, nan, nan, nan, nan, nan, nan, nan, nan, nan])
Run Code Online (Sandbox Code Playgroud)
将一个正确的方法zscore(或者不是scipy的等效函数)应用到pandas数据帧的列并让它忽略这些nan值是什么?我希望它与原始列具有相同的维度,np.nan对于无法规范化的值
编辑:也许最好的解决方案是使用scipy.stats.nanmean和scipy.stats.nanstd?我不明白为什么需要std为此目的改变自由度:
zscore = lambda x: (x - scipy.stats.nanmean(x)) / scipy.stats.nanstd(x)
Run Code Online (Sandbox Code Playgroud)