如何根据外部索引重新排序pandas数据帧行

时间:2015-05-15 18:59:49

标签: python pandas dataframe

我想根据外部映射重新排序数据框中的行。因此,例如,如果列表是(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

1 个答案:

答案 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 ];