【问题标题】:Drop rows from a pandas series based on a list根据列表从熊猫系列中删除行
【发布时间】:2020-01-06 00:03:19
【问题描述】:

我希望能够在一个 df 中生成索引 NaN 值的列表,然后使用该列表删除一系列中的相应行。目标是让 df 和系列具有相同的行数

但是我一直卡在最后一部分。如果我使用 drop() 我不会出现轴错误。我试过 isin() 但我似乎没有得到正确的结果

#create list of index of nan values in Garageyrblt
Index_nan_train = X_train[X_train['GarageYrBlt'].isna()].index.tolist()
# drop nan in garageyrblt X_train
X_train = X_train.drop(subset = ['GarageYrBlt'], axis = 0)
# use list to drop nan in garageyrblt Y_train
y_train = y_train.drop(['Index_nan_train'], axis = 0)

编辑:要添加更多详细信息,数据来自 kaggle 练习,用于处理中级机器学习课程中的缺失值。

X_train 是具有输入特征的 (1168,36) 数据框,y_train 是 (1168,) 系列,代表销售价格

【问题讨论】:

  • X_train 是一个数据帧。 y_train 似乎没有定义。您不能从 DataFrame 中删除单独定义的对象(在本例中为列表)。尝试提供 MCVE 以获得更好的帮助机会:stackoverflow.com/help/minimal-reproducible-example
  • 您是否尝试使用布尔掩码?类似y_train = y_train[~Index_nan_train]
  • 我刚试过,得到 TypeError: bad operand type for unary ~: 'list'
  • 啊,是的,我记得掩码本身应该是numpy.ndarray。所以这个丑陋的解决方法就像:Index_nan_train = np.ndarray(Index_nan_train)_train = y_train[~Index_nan_train]

标签: python pandas


【解决方案1】:

当您在两者上处理相同的转换时,一种更简单的方法是,您应该将它们放在一起,直到您完成清理并实际使用数据。

x_cols = X_train.columns
y_col = y_train.name
all = pd.concat((X_train, y_train), axis=1)
all = all.dropna(subset=["GarageYrBlt"])

X_train, y_train = all.loc[:,x_cols], all.loc[:,y_col]

或者使用difference索引方法:

nan_idx = X_train.loc[X_train["GarageYrBlt"].isna()].index
notna_idx = X_train.index.difference(nan_idx)

y_train = y_train.loc[notna_idx]

N.B:如果您使用groupbyreset_index 等对索引进行操作,那么对索引进行切片会很麻烦,所以请注意这个问题。

【讨论】:

    猜你喜欢
    • 2021-02-17
    • 1970-01-01
    • 2015-11-07
    • 2013-12-12
    • 2015-05-19
    • 2021-09-25
    • 1970-01-01
    • 2022-07-13
    • 2017-06-26
    相关资源
    最近更新 更多