python pandas dataframe groupby将同一组放在一起

时间:2018-06-05 04:22:33

标签: python pandas dataframe group-by

我有一个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

即,堆叠具有相同v1v2对的行。

v1 = a, v2 = bv1 = b, v2 = a不相等(我们无法交换v1v2),但它们被视为属于同一组。我该怎么做?

任何帮助表示赞赏!

2 个答案:

答案 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)

选项1

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

选项2

可能更直观,但也可能因为大量申请而变慢。

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

选项3

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