Jupyter重复执行单元格后统计值异常及原数值保留方法咨询
问题描述
假设我有一个含数百万行的大型df,需替换某列中的特殊字符ä和ö,执行如下代码:
print(df['Column'].str.contains('ä|ö', regex=True).sum()) umlaut_dict = {'ä':'ae','ö':'oe'} df.Column.replace(umlaut_dict, regex=True, inplace=True) print(df['Column'].str.contains('ä|ö', regex=True).sum())
首次执行正常,先显示需替换的字符数量,再确认全部替换完成;但第二次执行该单元格时,两次打印结果均为0。我的问题是:
- 这种情况是否需要担忧?Jupyter Notebook是否本就应仅运行一次?
- 能否不创建df副本的前提下保留初始统计的原数值?
解答
问题1解答
- 完全不用担忧,这是Jupyter Notebook的正常特性。因为你用了
inplace=True,第一次执行就直接修改了内存里的原df,第二次运行时,df里已经没有ä和ö了,所以两次打印都是0。Jupyter的单元格可以重复运行,但每次运行都是基于当前内存中的数据状态,不是回到脚本初始状态。如果要重复验证替换逻辑,要么重新加载原始数据,要么先把原始df备份好再操作。
问题2解答
- 可以做到,不用创建整个df的副本,只需要提前把初始统计值存到一个变量里就行。修改代码如下:
# 先把初始统计值存下来 initial_count = df['Column'].str.contains('ä|ö', regex=True).sum() print(initial_count) umlaut_dict = {'ä':'ae','ö':'oe'} df.Column.replace(umlaut_dict, regex=True, inplace=True) # 验证替换后的数量 print(df['Column'].str.contains('ä|ö', regex=True).sum()) # 之后随时可以调用initial_count查看原数值 # print(initial_count)
这样不管你后续怎么修改df,initial_count里都保留着第一次统计的原始数值,而且没有复制整个大df,不会占用额外的大量内存。
内容的提问来源于stack exchange,提问作者Very_new_to_this
相关产品推荐
相关产品推荐

