我有两个这样的列:
col count
(A,B) 19
(C,D) 18
(E,F) 10
(B,A) 9
(D,C) 80
我想要这个:
如果存在(pair2,pair1)
,则对col
中的每一对(pair1,pair2)
选择count
较高的一对
output
:
col count
(A,B) 19
(E,F) 10
(D,C) 80
您可以使用DataFrameGroupBy.idxmax
来获取最大的count
索引值分组,按排序和转换列表到元组:
g = df['col'].apply(lambda x: tuple(sorted(x)))
df = df.loc[df.groupby(g)['count'].idxmax()]
print (df)
col count
0 (A, B) 19
4 (D, C) 80
2 (E, F) 10
另一个想法是使用np.sort
对值进行排序,并传递第一个和第二个1d数组:
g = np.sort(df['col'].tolist(), axis=1)
df = df.loc[df.groupby([g[:, 0], g[:, 1]])['count'].idxmax()]
print (df)
col count
0 (A, B) 19
4 (D, C) 80
2 (E, F) 10
编辑:
如果输入值是元组,另一个解决方案:
df = (pd.DataFrame(np.sort(df['col'].tolist(), axis=1),
index=df.index,
columns=['key1','key2'])
.join(df)
.sort_values(['key1','key2','count'])
.drop_duplicates(['key1','key2'], keep='last')
.drop(['key1','key2'], axis=1))
print (df)
col count
3 (B, A) 19
1 (C, D) 80
2 (E, F) 10
如果有,
连接的字符串:
df = (pd.DataFrame(np.sort(df['col'].str.split(',').tolist(), axis=1),
index=df.index,
columns=['key1','key2'])
.join(df)
.sort_values(['key1','key2','count'])
.drop_duplicates(['key1','key2'], keep='last')
.drop(['key1','key2'], axis=1)
)
print (df)
col count
0 A,B 19
4 D,C 80
2 E,F 10