2015-06-20 55 views
0
>>import pandas as pd 
>>d = {'a':[5,4,3,1,2],'b':[1,2,3,4,5]} 
>>df = pd.DataFrame(d) 
>>df 
    a b 
0 5 1 
1 4 2 
2 3 3 
3 1 4 
4 2 5 

鉴于没有一间值的重复重新排序指标,B,有没有办法来计算变量指数这样的:熊猫找到列之间的匹配值

df['a'] = df['b'][indices] 

满意?在这种情况下,

>> indices = [4,3,2,0,1] 

>> df['b'][indices] 
4 5 
3 4 
2 3 
0 1 
1 2 

回答

0

我猜幼稚的做法是:

def getIndices(a,b): 
    rVal = [] 
    for i in a: 
     index = b.index(i) 
     rVal.append(index) 
    return rVal 

a = [5,4,3,1,2] 
b = [1,2,3,4,5] 

result = getIndices(a,b) 
print result 
# prints [4, 3, 2, 0, 1] 

我觉得这会给你O(nlogn)时间复杂度。

0

你可以试试 -

indices = [df['b'][df['b'] == row['a']].index[0] for idx, row in df.iterrows()] 
indices 
>> [4, 3, 2, 0, 1] 
0

您可以使用numpy.argsort()

import numpy as np 
a = np.array(["c", "b", "a", "x", "e", "d"]) 
b = np.array(["d", "a", "b", "c", "x", "e"]) 
idx_a = np.argsort(a) 
idx_b = np.argsort(b) 
print b[idx_b[idx_a]] 

结果是:

['c' 'b' 'a' 'x' 'e' 'd'] 
0

这可以用简单的Python来完成(不知道是否有更智能的熊猫专用方法)。

d = {k:v for v,k in enumerate(list(df['a']))} 
indices = [i[0] for i in sorted(enumerate(list(df['b'])), 
           key=lambda x: d.get(x[1]))] 

如果a某些元件不b反之亦然,你将不得不使用更智能的关键功能是宽容缺失值(并决定要如何处理这种情况,对于这个问题)。

相关问题