Python循环和Pandas rank/index qui

2024-05-29 10:33:46 发布

您现在位置:Python中文网/ 问答频道 /正文

这个问题与张贴在这里的问题有关: Sort dataframe rows independently by values in another dataframe

在这个链接的问题中,我使用一个Pandas数据帧,使用另一个Pandas数据帧中的值独立地对每一行进行排序。这里提供的函数在每次直接调用时都能完美地工作。例如:

import pandas as pd
import numpy as np
import os

##Generate example dataset
d1 = {}
d2 = {}
d3 = {}
d4 = {}
## generate data:
np.random.seed(5)
for col in list("ABCDEF"):
    d1[col] = np.random.randn(12)
    d2[col+'2'] = np.random.random_integers(0,100, 12)
    d3[col+'3'] = np.random.random_integers(0,100, 12)
    d4[col+'4'] = np.random.random_integers(0,100, 12)

t_index = pd.date_range(start = '2015-01-31', periods = 12, freq = "M")
#place data into dataframes   
dat1 = pd.DataFrame(d1, index = t_index)
dat2 = pd.DataFrame(d2, index = t_index)
dat3 = pd.DataFrame(d3, index = t_index)
dat4 = pd.DataFrame(d4, index = t_index)

## Functions 
def sortByAnthr(X,Y,Xindex, Reverse=False):
    #order the subset of X.index by Y
    ordrX = [x for (x,y) in sorted(zip(Xindex,Y), key=lambda pair: pair[1],reverse=Reverse)]
    return(ordrX)

def OrderRow(row,df):
    ordrd_row = df.ix[row.dropna().name,row.dropna().values].tolist()
    return(ordrd_row)

def r_selectr(dat2,dat1, n, Reverse=False):
    ordr_cols = dat1.apply(lambda x: sortByAnthr(x,dat2.loc[x.name,:],x.index,Reverse),axis=1).iloc[:,-n:]
    ordr_cols.columns = list(range(0,n)) #assign interpretable column names

    ordr_r = ordr_cols.apply(lambda x: OrderRow(x,dat1),axis=1)
    return([ordr_cols, ordr_r])

## Call functions    
ordr_cols2,ordr_r = r_selectr(dat2,dat1,5)

##print output:
print("Ordering set:\n",dat2.iloc[-2:,:])
print("Original set:\n", dat1.iloc[-2:,:])
print("Column ordr:\n",ordr_cols2.iloc[-2:,:])

可以检查,dat1的列根据dat2中的值正确排序。在

但是当从数据帧上的循环调用时,它不能正确排序/索引,并且生成完全可疑的结果。虽然我不能用这里介绍的简化版本来重现这个问题,但是想法应该是一样的。在

^{pr2}$

在我的代码中(几乎完全类似于这里给出的示例),排序数据帧的顺序不再正确。在

我目前解决这个问题的方法是将排序和索引操作与r\u selector分离为两个单独的函数。这,出于某种原因,解决了这个问题,尽管我不知道为什么。在


Tags: 数据dataframeindex排序npcolrandomreverse

热门问题