[英]re-ordering a pandas dataframe to match column elements in another dataframe
我想重新排序一個數據幀以匹配另一個數據幀中兩列的順序。
這種方法有效——但肯定有人可以提出更有效的方法嗎?
import numpy as np
import pandas as pd
df = pd.DataFrame({'X_intent' : [1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8],
'Y_intent' :np.ravel([np.repeat(1,8),np.repeat(2,8), np.repeat(3,8)]),
'Values' : [1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8]})
p = pd.DataFrame( {'OrderX': [8,7,6,5,4,3,2,1,8,7,6,5,4,3,2,1,8,7,6,5,4,3,2,1], 'OrderY': np.ravel([np.repeat(1,8),np.repeat(2,8), np.repeat(3,8)])})
p['indx'] = p.OrderX.astype(str)+' '+p.OrderY.astype(str)
df['indx'] = df.X_intent.astype(str)+' '+df.Y_intent.astype(str)
res = list()
for i in p["indx"]:
res.append(np.where(df['indx'] == i))
res = [np.asscalar(item[0]) for sublist in l for item in res]
df.iloc[res]
謝謝你的幫助。
我認為這里可以使用DataFrame.merge
,如果DataFrame
中的所有值都可以使用默認inner
連接, rename
用於避免具有相同值的重復列:
c = {'OrderX':'X_intent','OrderY':'Y_intent'}
df = p.rename(columns=c).merge(df, on=['X_intent','Y_intent'])
print (df)
X_intent Y_intent Values
0 8 1 8
1 7 1 7
2 6 1 6
3 5 1 5
4 4 1 4
5 3 1 3
6 2 1 2
7 1 1 1
8 8 2 8
9 7 2 7
10 6 2 6
11 5 2 5
12 4 2 4
13 3 2 3
14 2 2 2
15 1 2 1
16 8 3 8
17 7 3 7
18 6 3 6
19 5 3 5
20 4 3 4
21 3 3 3
22 2 3 2
23 1 3 1
df = p.merge(df, left_on=['OrderX','OrderY'], right_on=['X_intent','Y_intent'])
print (df)
OrderX OrderY X_intent Y_intent Values
0 8 1 8 1 8
1 7 1 7 1 7
2 6 1 6 1 6
3 5 1 5 1 5
4 4 1 4 1 4
5 3 1 3 1 3
6 2 1 2 1 2
7 1 1 1 1 1
8 8 2 8 2 8
9 7 2 7 2 7
10 6 2 6 2 6
11 5 2 5 2 5
12 4 2 4 2 4
13 3 2 3 2 3
14 2 2 2 2 2
15 1 2 1 2 1
16 8 3 8 3 8
17 7 3 7 3 7
18 6 3 6 3 6
19 5 3 5 3 5
20 4 3 4 3 4
21 3 3 3 3 3
22 2 3 2 3 2
23 1 3 1 3 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.