Pandas按元素分组(GroupBy)及其他

7

我在使用Pandas的分组(groupby)时遇到了麻烦。比如,我有以下数据:

df2 = pd.DataFrame({'X' : ['B', 'B', 'A', 'A', 'C'], 'Y' : [1, 2, 3, 4, 5]})

我希望进行一个Groupby操作,将所有的A分组到一起,将所有的非A分组到一起,就像这样:

df2.groupby(<something>).groups
Out[1]: {'A': [2, 3], 'not A': [0, 1, 4]}

我尝试过将函数发送进去,但无法使其实现。这种方式可行吗?
非常感谢。
3个回答

5
In [3]: df2.groupby(df2['X'] == 'A').groups
Out[3]: {False: [0, 1, 4], True: [2, 3]}

3

扩展@Dan Allan的答案 - 如果您想为您的组命名,您可以使用numpy.where()来创建映射数组:

>>> df2 = pd.DataFrame({'X' : ['B', 'B', 'A', 'A', 'C'], 'Y' : [1, 2, 3, 4, 5]})
>>> m = np.where(df2['X'] == 'A', 'A', 'not A')
>>> df2.groupby(m).groups
{'A': [2, 3], 'not A': [0, 1, 4]}

如果要检查df2['X']是否为A或B,可以使用df2['X'].isin(['A', 'B'])代替df2['X'] == 'A',或者更加笨拙的np.logical_or(df2['X'] == 'A', df2['X'] == 'B')


你如何扩展到 df2['X'] == 'B' 呢?m = np.where(df2['X'] == 'A' or df2['X'] == 'B', 'Group1', 'Group2') 似乎不起作用....? - Woody Pride

1

是的,groupby操作可能是最有用的,但在文档中解释得最差的操作之一。

我认为你尝试使用函数来完成这个任务是对的。对我来说,这是最好的方法,因为函数是抽象的,所以可以反复使用,如果你想改变做什么但改变参数。Dan Allan提供的答案绝对是我会采取的方法,也是最优雅的方法,但供您参考,这是如何使用函数实现您想要做的事情。

def GroupFunc(x, df, col, Value):
    if df[col][x] == Value:
        return "Group 1" 
    else:
        return "Group 2"

DFGrouped = df2.groupby(lambda x: GroupFunc(x, df2, 'X', 'A'))

需要翻译的内容:

要理解的是,作为分组键传递的任何函数都会针对每个索引值调用一次,并使用返回值作为分组名称。因此,在此示例中,当您调用函数时,x是索引值,然后剩余的参数是您感兴趣的数据帧、正在处理的列以及要测试的值。

请注意,上述所有内容也可以通过使用匿名函数在单行中实现:

DFGrouped = df2.groupby(lambda x: 'Group 1' if df2.X[x] == 'A' else 'Group 2')

希望这有所帮助。

Woody,仔细看过后,我认为你的解决方案最好,因为它可以很好地扩展到多个组,这也是我想要的。非常感谢你的答案。 - dvreed77

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接