Python группы данных DataFrame объединить одну группу - PullRequest
0 голосов
/ 05 июня 2018

У меня есть фрейм данных 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), но они считаются принадлежащими к одной группе.Как я могу это сделать?

Любая помощь приветствуется!

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Аналогичным образом используйте 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
0 голосов
/ 05 июня 2018

Опция 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...