【问题标题】:How to remove objects from a list using a list of indexes on python?如何使用python上的索引列表从列表中删除对象?
【发布时间】:2021-10-28 06:35:27
【问题描述】:

我有一个 DataFrame,我想从中随机选择 20% 的数据用作测试数据。但是,我需要从我的原始数据集中删除所述数据以用作训练数据。 我有一个随机样本组成的索引列表(原始 DF 的索引)。当我使用 for 循环和函数 .pop() 时,索引会发生变化,因此在第一次迭代之后删除的元素不是我的测试数据框中的元素。我需要帮助才能从第一个数据框中删除数据,但没有函数会将索引列表作为参数。我该怎么办?有没有办法从另一个数据中减去一个数据?

【问题讨论】:

  • 请提供足够的代码,以便其他人更好地理解或重现问题。

标签: pandas dataframe indexing


【解决方案1】:

关于你的问题,

有没有办法从另一个数据中减去一个数据?

您可以简单地从主 DataFrame 中删除属于 Test 的索引以获取您的 Train。试试这个 -

train = df.drop(test.index, axis=0)

#Where df is the main dataset from which test data has been sampled.
#train, test, df are all pd.DataFrames

但是,如果您正在为机器学习问题准备数据,我会推荐一些更好的方法,如我的答案的下一部分所述。


1。使用 Sklearn API(推荐)

您可以尝试使用sklearn.model_selection.train_test_split api 来为您节省大量进行此类训练测试拆分的时间。

from sklearn.model_selection import train_test_split

df = pd.DataFrame(np.random.random((100,10)))

train, test = train_test_split(df, test_size=0.2)
train.shape, test.shape
((80, 10), (20, 10))

2。使用 pandas 方法

另一种方法是从 df 中抽取 20% 的数据,然后过滤其余数据以进行训练。

test = df.sample(frac=0.2)
train = df.loc[~df.index.isin(test.index)]
train.shape, test.shape
((80, 10), (20, 10))

3。从索引列表开始

假设您已经有一个索引列表 (test_idx),正如您在问题中提到的那样。在这种情况下,您仍然可以使用 pandas 方法来执行此操作,而无需任何 for 循环或 pop()

test_idx = np.random.choice(range(100), 20, replace=False) #approx 20% random indexes 

test = df.loc[df.index.isin(test_idx)]
train = df.loc[~df.index.isin(test_idx)]
train.shape, test.shape
((80, 10), (20, 10))

【讨论】:

  • 谢谢!这非常有用!
【解决方案2】:

这个问题有几个解决方案。你可以...

  • 反向迭代
  • 创建另一个数组来存储值
  • 使用列表理解

第三种方法的例子如下。

假设您想从数组中删除所有 2:

data = [1, 2, 3, 2, 2, 1]
new_data = [n for n in data if n != 2]
# new_data = [1, 3, 1]

根据我过去的经验,这始终是我在清理/重建数组时使用的方法。

【讨论】:

    猜你喜欢
    • 2014-06-29
    • 1970-01-01
    • 2016-12-19
    • 1970-01-01
    • 2012-04-03
    • 1970-01-01
    • 2016-12-03
    • 2017-03-05
    • 1970-01-01
    相关资源
    最近更新 更多