我有一个pandas数据框df
:
df = pd.DataFrame(data = {'v1': ['b', 'b', 'c', 'a', 'd', 'c', 'd', 'c', 'f', 'e'],
'v2': ['a', 'a', 'd', 'b', 'c', 'e', 'c', 'd', 'g','c'],
'v3': [3.3, 2.9, 3.5, 4.7, 5.1, 1.1, 2.3, 3.4, 4.7, 6.1]})
v1 v2 v3
0 b a 3.3
1 b a 2.9
2 c d 3.5
3 a b 4.7
4 d c 5.1
5 c e 1.1
6 d c 2.3
7 c d 3.4
8 f g 4.7
9 e c 6.1
我想生成结果如下:
v1 v2 v3
0 b a 3.3
1 b a 2.9
3 a b 4.7
2 c d 3.5
4 d c 5.1
6 d c 2.3
7 c d 3.4
5 c e 1.1
9 e c 6.1
8 f g 4.7
即,堆叠具有相同v1
和v2
对的行。
v1 = a, v2 = b
和v1 = b, v2 = a
不相等(我们无法交换v1
和v2
),但它们被视为属于同一组。我该怎么做?
任何帮助表示赞赏!
答案 0 :(得分:4)
以类似的方式,使用argsort
:
df.iloc[pd.Series(
[tuple(x) for x in np.sort(df.iloc[:, :2], axis=1)]).argsort()
]
v1 v2 v3
0 b a 3.3
1 b a 2.9
3 a b 4.7
2 c d 3.5
4 d c 5.1
6 d c 2.3
7 c d 3.4
5 c e 1.1
9 e c 6.1
8 f g 4.7
答案 1 :(得分:3)
df.loc[sorted(df.index, key=lambda i: tuple(sorted(df.loc[i, ['v1', 'v2']])))]
v1 v2 v3
0 b a 3.3
1 b a 2.9
3 a b 4.7
2 c d 3.5
4 d c 5.1
6 d c 2.3
7 c d 3.4
5 c e 1.1
9 e c 6.1
8 f g 4.7
可能更直观,但也可能因为大量申请而变慢。
df.reindex(df.apply(frozenset, 1).apply(tuple).sort_values().index)
v1 v2 v3
0 b a 3.3
1 b a 2.9
3 a b 4.7
2 c d 3.5
4 d c 5.1
6 d c 2.3
7 c d 3.4
5 c e 1.1
9 e c 6.1
8 f g 4.7
a = np.empty(len(df), object)
a[:] = list(map(sorted, zip(df.v1, df.v2)))
df.iloc[np.argsort(a)]
v1 v2 v3
0 b a 3.3
1 b a 2.9
3 a b 4.7
2 c d 3.5
4 d c 5.1
6 d c 2.3
7 c d 3.4
5 c e 1.1
9 e c 6.1
8 f g 4.7