我正在使用某个分类器根据特定列中的值对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
编辑:上面的代码使显示好像它以我期望的方式行事,但我想要一些更无可否认的证据,如果可用的话。
答案 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
似乎保留了订单。