Pandas groupby汇总与数据框之间的差异,尤其是在axis = 1上

时间:2019-04-03 04:29:52

标签: 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", "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()

我不了解发生的失败,我也不明白为什么对2个组应用失败但对1个组失败。

我已经实现了总体目标(我试图将一些列的字符串连接在一起),但是我担心这些失败会让我感到困惑。

参考的驱动目标是能够做到

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

我也不明白为什么这样不起作用

尤其是自

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

1 个答案:

答案 0 :(得分: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")

...以上操作失败,因为您正在应用-使用需要数字类型的Python sum函数。您可以使用以下任何一种方法来解决此问题(我认为,这实际上取决于numpy处理大熊猫将其转换为的对象dtypes的能力):

df.apply(np.sum)
df.sum()

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

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

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

...如果添加axis = 1,它们将起作用并给出合理的结果。


请注意,您在以下位置缺少右括号:

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

...同时在示例代码中和后面的注释中。

似乎您是在说代码的最后一点是实现您的目标的要素。上一次尝试:

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

...正在加入存在的一组的 index 中的项目,而不是单个系列。检查:

print(gb1.groups)

最后,给定您的数据框,如果您要执行的操作是将列与“;”连接起来他们之间,您也可以这样做:

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

或少量物品

df['concat'] = df['ay'] + ";" + df['be']

...而不是使用groupby。