>>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
如果a,b之间没有重复的值,是否有办法计算变量 indices ,以便:
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 :(得分: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)
时间复杂性。
答案 1 :(得分:0)
你可以尝试 -
indices = [df['b'][df['b'] == row['a']].index[0] for idx, row in df.iterrows()]
indices
>> [4, 3, 2, 0, 1]
答案 2 :(得分: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']
答案 3 :(得分: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
中,反之亦然,那么您必须使用能够容忍缺失值的智能键功能(并决定如何使用你想处理这个案子,就此而言。)