基于两个变量的熊猫分组

时间:2020-03-11 15:26:54

标签: pandas grouping pandas-groupby

+---------+---------+-------+
| 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     |
+---------+---------+-------+

使用熊猫: 我正在尝试基于“ g_var_1”和“ g_var_2”创建一个“组”变量。从上面的ASCII表中可以看到,逻辑是将“ g_var_1”和g_var_2”的相同组合组合在一起,因此,在(g_var_1 ==“ A”和g_var_2 ==“ B”)的观察结果中与(g_var_1 ==“ B”和g_var_2 ==“ A”)的观察组相同。

我正在使用的数据集具有一千多行,因此手动执行此操作不是我的最佳解决方案。

任何帮助将不胜感激。预先感谢!

2 个答案:

答案 0 :(得分:2)

首先sort,然后将ngroupgroupby一起使用

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 :(得分:1)

使用合并的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'),它将所有等效对组合在一起。