Pandas groupby聚合与数据帧的差异,尤其是在轴=1上

Pandas groupby聚合与数据帧的差异,尤其是在轴=1上,pandas,group-by,aggregate-functions,pandas-groupby,Pandas,Group By,Aggregate Functions,Pandas Groupby,我不理解出现的失败,也不理解为什么“应用于组”在两个组中失败,但在一个组中失败 我已经解决了我的总体目标(我试图将一些列串连接在一起),但我担心这些失败会让我有些困惑 参考的驱动目标是能够 import pandas as pd import numpy as np def main(): df = pd.DataFrame([["a", "b", "c", "k"],["d", "e", "f", "l"],['g','h','i', "J"]], columns=["ay", "b

我不理解出现的失败,也不理解为什么“应用于组”在两个组中失败,但在一个组中失败

我已经解决了我的总体目标(我试图将一些列串连接在一起),但我担心这些失败会让我有些困惑

参考的驱动目标是能够

import pandas as pd
import numpy as np

def main():
    df = pd.DataFrame([["a", "b", "c", "k"],["d", "e", "f", "l"],['g','h','i', "J"]], columns=["ay", "be", "ce", "jay"])
    print(df)

    gb1 = df.groupby({"ay": "x", "be": "x"}, axis=1)
    gb2 = df.groupby({"ay": "x", "be": "x", "ce": "y", "jay": "y"}, axis=1)

    print("apply sum by axis 0")
    #print(df.apply(sum))
    print("fails")

    print("apply sum by axis 1")
    # print(df.apply(sum, axis=1))
    print("fails")

    print("agg sum by axis 0")
    print(df.agg(sum))

    print("agg sum by axis 1")
    print(df.agg(sum, axis=1))

    print("gb1 apply sum axis 1")
    print(gb1.apply(sum))

    print("gb1 agg sum axis 1")
    print(gb1.agg(sum))

    print("gb2 apply sum axis 1")
    # print(gb2.apply(sum))
    print("fails")

    print("gb2 agg sum axis 1")
    print(gb2.agg(sum))

    print(gb1.agg(lambda x: ";".join([x[0], x[1]]))


if __name__ == "__main__":
    main()
我也不明白为什么这样不行

尤其是自从

gb1.agg(lambda x: ";".join(x))

里面有很多东西要打开

gb1.agg(lambda x: ";".join([x[0], x[1]]) does
…上述操作失败,因为您正在应用Python sum函数,该函数需要数字类型。您可以使用以下任意一种方法来解决这个问题(我认为这取决于numpy处理pandas将其转换为的对象数据类型的能力):


接下来,这两项在print语句中表示axis=1,但实际上不是:

df.apply(np.sum)
df.sum()
…如果你加上axis=1,它们就会工作并给出合理的结果


请注意,以下内容中缺少右括号:

    print("gb1 apply sum axis 1")
    print(gb1.apply(sum))

    print("gb2 apply sum axis 1")
    # print(gb2.apply(sum))
    print("fails")
…在示例代码和后面的注释中

看起来你是在说代码的最后一部分是实现你目标的东西。上一次尝试:

gb1.agg(lambda x: ";".join([x[0], x[1]])
…将出现的一个组的索引中的项目连接起来,而不是单个系列。检查:

gb1.agg(lambda x: ";".join(x))

最后,给定您的数据帧,如果您想做的是在列之间连接“;”,您还可以做:

print(gb1.groups)
或者对于少量项目

cols = ['ay','be']
df.apply(lambda x: ";".join((x[c] for c in cols)), axis=1)

…而不是使用groupby。

Ah,groupby agg没有axis,但有apply。一般来说,我对数据帧[apply | agg | transform]和groupby[apply | agg | transform]之间的区别有点困惑。其中有些具有共享参数列表,有些具有类似的行为,有些似乎完全不同,而且所有这些都似乎具有一些冗余功能(即,对groupby的1个组执行应用类似于对列选择执行应用,您可以同时执行agg和apply sum)
cols = ['ay','be']
df.apply(lambda x: ";".join((x[c] for c in cols)), axis=1)
df['concat'] = df['ay'] + ";" + df['be']