pandas Группировка на основе двух переменных - PullRequest
1 голос
/ 11 марта 2020
+---------+---------+-------+
| g_var_1 | g_var_2 | group |
+---------+---------+-------+
| A       | B       | 1     |
+---------+---------+-------+
| B       | A       | 1     |
+---------+---------+-------+
| C       | D       | 2     |
+---------+---------+-------+
| D       | C       | 2     |
+---------+---------+-------+
| E       | F       | 3     |
+---------+---------+-------+
| F       | E       | 3     |
+---------+---------+-------+
| G       | H       | 4     |
+---------+---------+-------+
| H       | G       | 4     |
+---------+---------+-------+

Использование pandas: я пытаюсь создать переменную "group" на основе "g_var_1" и "g_var_2". Как видно из приведенной выше таблицы ASCII, логика c состоит в том, что одни и те же комбинации "g_var_1" и g_var_2 "сгруппированы вместе. Поэтому наблюдения с (g_var_1 ==" A "и g_var_2 ==" B ") будут быть в той же группе, что и наблюдения с (g_var_1 == "B" и g_var_2 == "A").

В наборе данных, с которым я работаю, более тысячи строк, поэтому выполнение этого вручную не оптимальное решение для меня.

Любая помощь будет принята с благодарностью. Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 11 марта 2020

Сначала sort, затем используйте ngroup с groupby

l=['g_var_1','g_var_2']
pd.DataFrame(np.sort(df[l],1),columns=l).groupby(l).ngroup().add(1)
Out[340]: 
0    1
1    1
2    2
3    2
4    3
5    3
6    4
7    4
dtype: int64
df['group']=pd.DataFrame(np.sort(df[l],1),columns=l).groupby(l).ngroup().add(1)

.values ​​

1 голос
/ 11 марта 2020

Создайте столбец с объединенным g_var, в котором хранится кортеж, включающий два значения.

Чтобы их можно было сравнивать одинаково, сохраняйте кортеж отсортированным, поэтому "B", "A" также станет ("A", "B").

Для достижения этого результата можно использовать метод apply(), используя пользовательскую функцию.

def make_tuple_var(row):
    var1 = row['g_var_1']
    var2 = row['g_var_2']
    if var1 > var2:
        # Swap them.
        var1, var2 = var2, var1
    return (var1, var2)

Затем вы можете использовать его в:

df['g_var'] = df.apply(make_tuple_var, axis=1)

И, наконец, вы можете groupby('g_var'), который сгруппирует все эквивалентные пары вместе.

...