我想根据外部映射重新排序数据框中的行。因此,例如,如果列表是(2,1,3),我想将旧df中的第一项移动到新df中的第二项。我认为我的问题与此相同:How to reorder indexed rows based on a list in Pandas data frame但该解决方案无效。这是我尝试过的:
a = list(sampleinfo.filename)
b = list(exprs.columns)
matchIndex2 = [a.index(x) for x in b]
(1)
sampleinfo2 = sampleinfo[matchIndex2,]
(2)
sampleinfo2 = sampleinfo
sampleinfo2.reindex(matchIndex2)
两种解决方案都没有错误,但顺序没有改变 - 就像我没有做任何事情一样。
我正在尝试确保exprs中的列和sampleinfo中行的文件名值的顺序相同。在我看到的解决方案中,我看到我可以对exprs的列进行排序:
a = list(sampleinfo.filename)
b = list(exprs.columns)
matchIndex = [b.index(x) for x in a]
exprs = exprs[matchIndex]
但我希望能够按行排序。我怎么能这样做?
我正在使用的数据框太大而无法粘贴,但这是一般情况:
exprs:
a1 a2 a3 a4 a5
1 2 2 2 1
4 3 2 1 1
sampleinfo:
filename otherstuff
a1 fwsegs
a5 gsgers
a3 grsgs
a2 gsgs
a4 sgs
答案 0 :(得分:0)
这是一个使用与数据框中特定列相关联的外部列表重新排序行的函数:
def reorder(A, column, values):
"""Re-order data frame based on a column (given in the parameter
column, which must have unique values)"""
if set(A[column]) != set(values):
raise Exception("ERROR missing values for re-ordering")
at_position = {}
index = 0;
for v in A[column]:
at_position[v] = index
index += 1
re_position = [ at_position[v] for v in values ]
return A.iloc[ re_position ];