为何无法在pandas的drop()方法中使用df.loc()指定删除行?
问题原因与解决方法
为什么你的代码会报错?
你传入drop()的df.loc['NL':'QC']是完整的DataFrame对象,但drop()方法的第一个参数labels需要的是行索引标签(axis=0时)或列名(axis=1时),而非整个DataFrame。
当默认axis=0(操作行)时,pandas会把传入的DataFrame的列名当成要删除的行索引标签去查找,而你的行索引是省份名称,自然找不到province、province_name这些列名,所以报错。
当你设置axis=1时,pandas会把这些列名当成要删除的列,所以所有列都被删掉了,剩下的是无列的空DataFrame——你看到的"仅保留NL到QC的索引"是误解,那其实还是原DataFrame的行索引,只是列被清空了。
正确的删除方式
方法1:传递行索引标签
提取df.loc['NL':'QC']的索引,传给drop():
df.drop(df.loc['NL':'QC'].index)
方法2:直接用index参数指定切片(pandas 1.4.0及以上版本支持)
更简洁的写法,直接在drop()里通过index参数传入行切片:
df.drop(index='NL':'QC')
方法3:切片取反(替代思路)
如果想保留NL到QC之外的行,也可以直接取反筛选:
df = df.loc[~df.index.isin(df.loc['NL':'QC'].index)] # 若索引是有序的,还可以这么写(假设PE是NL的前一个索引,ON是QC的后一个) df = pd.concat([df.loc[:'PE'], df.loc['ON':]])
内容的提问来源于stack exchange,提问作者Donna_Tartare
相关产品推荐
相关产品推荐

