【问题标题】:Drop rows by index from dataframe从数据框中按索引删除行
【发布时间】:2017-12-21 21:27:26
【问题描述】:

我有一个数组wrong_indexes_train,其中包含我想从数据框中删除的索引列表:

[0, 63, 151, 469, 1008]

要删除这些索引,我正在尝试:

df_train.drop(wrong_indexes_train)

但是,代码失败并出现错误:

ValueError: labels ['OverallQual' 'GrLivArea' 'GarageCars' 'TotalBsmtSF' 'FullBath'
 'YearBuilt'] not contained in axis

这里,['OverallQual' 'GrLivArea' 'GarageCars' 'TotalBsmtSF' 'FullBath' 'YearBuilt'] 是我的数据框列的名称。

我怎样才能让数据框删除我指定的索引的整行?

【问题讨论】:

标签: python pandas dataframe


【解决方案1】:

改成

df_train.drop(wrong_indexes_train,axis=1)

【讨论】:

  • 其实是axis=1,因为我删除的是行,而不是列,但我想通了看你的答案。
  • 这就是我最初拥有的,然后我在文档另有说明后对其进行了编辑。很高兴我能帮上忙。 axis : int or axis name 是否从索引(0 / ‘index’)或列(1 / ‘columns’)中删除标签。
  • 我认为 drop(rownumber) 会删除 row = rownumber。 axis =1 表示列。这是什么东西掉下来了?
  • 上面看起来有点混乱; axis=1 确实会删除列,因此 axis=0 或 axis='index' 将是删除行的方式。正确的方法,但需要根据用例正确设置该参数。
【解决方案2】:

如果没有最小(非)工作示例,则不能 100% 确定您想要什么,但您应该指定 axis 参数。 df.drop 返回修改后的 DataFrame。如果要就地操作,指定inplace=True

有关符号行名称(索引),请参见此处:

df = pd.DataFrame({"ones":[1,3,5],
                   "tens":[20, 40, 60]},
                  index=['barb', 'mark', 'ethan'])
df.drop(['barb', 'mark'], axis='index')

这对于数字(默认)索引:

df = pd.DataFrame({"ones":[1,3,5],
                   "tens":[20, 40, 60]})
df.drop([0,2], axis='index')

【讨论】:

    【解决方案3】:

    试试

    df_train=df_train.reset_index() 
    

    紧随其后

    df_train.drop(wrong_indexes_train)
    

    我的猜测是 df_train 现在没有数字索引,而是 ['OverallQual' 'GrLivArea' 'GarageCars' 'TotalBsmtSF' 'FullBath' 'YearBuilt'] 列之一用作索引。

    【讨论】:

    • 请考虑编辑此以添加代码块,这将大大提高可读性。
    • 索引指的是行,而不是列。
    【解决方案4】:

    为此可以使用 drop DataFrame.drop

    考虑到要删除行,应该使用axis=0axis='index'。如果要删除列,axis=1axis='columns'

    对于您的具体情况,可以这样做

    wrong_indexes_train = [0, 63, 151, 469, 1008]
    
    df_train.drop(wrong_indexes_train, axis=0, inplace=True)
    

    df_train.drop(df_train[[0, 63, 151, 469, 1008]], axis=0, inplace=True)
    

    也可以选择DataFrame.index的行

    wrong_indexes_train = df_train.index[[0, 63, 151, 469, 1008]]
    
    df_train.drop(wrong_indexes_train, inplace=True)
    

    另一方面,假设一个人的数据框和要删除的行相当大,可能需要考虑选择要保留的行(如Dennis Golomazov suggests here)。为此,可以使用Mad Physicist's approach

    import numpy as np
    
    wrong_indexes_train = [0, 63, 151, 469, 1008]
    
    mask = np.ones((len(df_train), bool)
    
    mask = df_train.iloc[wrong_indexes_train] = False
    
    df_train_new = df_train.iloc[mask]
    

    【讨论】:

      猜你喜欢
      • 2013-05-12
      • 1970-01-01
      • 2021-07-22
      • 1970-01-01
      • 1970-01-01
      • 2022-11-05
      • 2016-06-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多