在预先排序的DataFrame上使用pandas groupby进行迭代顺序

时间:2017-11-08 17:20:19

标签: python pandas group-by pandas-groupby

情况

我正在使用某个分类器根据特定列中的值对DataFrame中的行进行分类。我的目标是根据特定条件将结果附加到一个或另一个新列。代码看起来像这样:

def get_queryset(self):
    return models.Company.filter(user=self.request.user)

问题

我担心df = pd.DataFrame({'A': [list with classifier ids], # Only 3 ids, One word strings 'B': [List of text to be classified], # Millions of unique rows, lines of text around 5-25 words long 'C': [List of the old classes]} # Hundreds of possible classes, four digit integers stored as strings df.sort_values('A', inplace=True) new_col1, new_col2 = [], [] for name, group in df.groupby('A', sort=False): classifier = classy_dict[name] vectors = vectorize(group.B.values) preds = classifier.predict(vectors) scores = classifier.decision_function(vectors) for tup in zip(preds, scores, group.C.values): if tup[2] == tup[0]: new_col1.append(np.nan) new_col2.append(tup[2]) else: new_col1.append(str(classifier.classes_[tup[1].argsort()[-5:]])) new_col2.append(np.nan) df['D'] = new_col1 df['E'] = new_col2 不会像我期望的那样以自上而下的顺序进行迭代。 the docs

中未涵盖groupby时的迭代顺序

我的期望

我在这里寻找的是sort=False以我期望的自上而下的外观顺序迭代的一些肯定。如果有更好的方法来完成所有这些工作,建议表示赞赏。

以下是我用groupby('col', sort=False)迭代顺序测试我的理论的代码:

sort=False

编辑:上面的代码使显示好像它以我期望的方式行事,但我想要一些更无可否认的证据,如果可用的话。

2 个答案:

答案 0 :(得分:3)

是的,当您通过sort=False时,将保留首次出现的顺序。 groupby源代码有点不透明,但是有一个函数groupby.ngroup可以完全回答这个问题,因为它直接告诉您迭代发生的顺序。

def ngroup(self, ascending=True):
    """
    Number each group from 0 to the number of groups - 1.
    This is the enumerative complement of cumcount.  Note that the
    numbers given to the groups match the order in which the groups
    would be seen when iterating over the groupby object, not the
    order they are first observed.
    ""

@coldspeed中的数据

df['sort=False'] = df.groupby('col', sort=False).ngroup()
df['sort=True'] = df.groupby('col', sort=True).ngroup()

输出:

    col  sort=False  sort=True
0   16           0          7
1    1           1          0
2   10           2          5
3   20           3          8
4    3           4          2
5   13           5          6
6    2           6          1
7    5           7          3
8    7           8          4

sort=False的基础上进行迭代时,在sort=True的基础上对组进行排序,然后进行迭代。

答案 1 :(得分:1)

让我们做一点实证检验。您可以迭代attributes并查看迭代组的顺序。

groupby

似乎保留了订单。