Python循环和Pandas排名/索引怪癖

时间:2016-05-06 13:57:09

标签: python loops sorting pandas indexing

这个问题属于这里发布的一个问题: Sort dataframe rows independently by values in another dataframe

在链接的问题中,我利用Pandas Dataframe使用另一个Pandas Dataframe中的值独立地对每一行进行排序。它所呈现的功能在每次被直接调用时都能完美运行。例如:

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中的值正确排序。

然而,当从数据帧上的循环调用时,它不会正确排名/索引并产生完全可疑的结果。虽然我无法使用此处提供的简化版本重新创建问题,但这个想法应该是相同的。

## Loop test:
out_dict = {}
data_dicts = {'dat2':dat2, 'dat3': dat3, 'dat4':dat4}

for i in range(3):
    #this outer for loop supplies different parameter values to a wrapper
    #function that calls r_selectr.
    for key in data_dicts.keys():
        ordr_cols,_ = r_selectr(data_dicts[key], dat1,5)
        out_list.append(ordr_cols)

        #do stuff here
#print output:
print("Ordering set:\n",dat3.iloc[-2:,:])
print("Column ordr:\n",ordr_cols2.iloc[-2:,:])

在我的代码中(几乎完全类似于此处给出的示例),不再为任何排序数据帧正确排序ordr_cols。

我目前通过将r_selectr的排序和索引操作分成两个独立的函数来解决问题。由于某种原因,我解决了这个问题,虽然我不知道为什么。

0 个答案:

没有答案