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]}

我已经尝试过发送函数之类的方法,但无法正常工作。这可能吗?

非常感谢。

4

3 回答 3

5
In [3]: df2.groupby(df2['X'] == 'A').groups
Out[3]: {False: [0, 1, 4], True: [2, 3]}
于 2013-10-29T02:47:11.983 回答
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')

于 2013-10-29T08:02:11.357 回答
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')

希望这可以帮助

于 2013-10-29T05:47:24.893 回答