1

我有一个数据集,我想用更快的方法删除一些行。我试过下面的代码,但花了很长时间

我想删除所有少于 3 次操作的用户。

每个操作都存储在 user_id 不是我的数据 ID 的行中

undesirable_users=[] 
for i in range(len(operations_per_user)):
    if operations_per_user.get_value(operations_per_user.index[i])<=3:
        undesirable_users.append(operations_per_user.index[i])

for i in range(len(undesirable_users)):
    data = data.drop(data[data.user_id == undesirable_users[i]].index)

data是一个数据框,operation_per_user是由以下人员创建的系列:operation_per_user = data['user_id'].value_counts().

4

3 回答 3

0
  • 如果data是 pandas DataFrame,并且它同时包含user_idoperations_per_user作为列,则应使用以下命令执行删除:
data = data.drop(data.loc[data['operations_per_user'] <= 3].index)

编辑

operations_per_user您可以添加以下内容,而不是创建单独的系列data

data['operations_per_user'] = data.loc[:, 'user_id'].value_counts()

您可以执行上述删除或使用逆逻辑条件执行选择:

data = data.loc[data['operations_per_user' > 3]]

原来的

如果您可以提供有关代码中使用的变量的更多信息,那将是更好的选择。

  • 如果operations_per_user是 pandas Series,您的第一个循环可以通过以下方式改进:
undesirable_users=[] 
for i in operations_per_user.index:
    if operations_per_user.loc[i] <= 3:
        undesirable_users.append(i)

该功能get_value()已弃用,请使用lociloc代替。loc是对and的一个很好的总结iloc这里有一个很棒的 pandas 备忘单可供参考。

  • 您可以使用 python 列表作为迭代器;对于您的第二个循环:
for user in undesirable_users:
    data = data.drop(data.loc[data['user_id'] == user].index)
于 2019-05-02T23:13:49.760 回答
0

为什么不直接过滤它们?你根本不需要循环。

您可以通过以下方式获取过滤后的索引:

operations_per_user.index[operations_per_user <= 3]

然后您可以从 df 中过滤这些索引,从而得到解决方案:

data = data[data['user_id'] not in (operations_per_user.index[operations_per_user <= 3])]

编辑

我的理解是,您要删除数据中出现次数少于 3 次的任何用户。您无需为此创建value_counts列表,您可以执行groupby并找到计数,然后在此基础上进行过滤。

filtered_user_ids = data.groupby('user_id').filter(lambda x: len(x) <= 3)['user_id'].tolist()

data = data[~data[user_id].isin(filtered_user_ids)]
于 2019-05-02T23:19:40.853 回答
0

您可以简单地选择要保持恢复逻辑条件的行,而不是删除。

首先,选择要保留的用户。
然后得到一个布尔列表,长度等于data行。
最后,选择要保留的行。

keepusers = operation_per_user.loc[operation_per_user > 3]
tokeep = [uid in keepuser for uid in data['user_id']]
newdata = data.loc[tokeep]
于 2019-05-03T00:03:50.297 回答