Расхождения в групповых агрегатах Pandas и кадре данных, особенно по оси = 1 - PullRequest
0 голосов
/ 03 апреля 2019
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 группами, но не с одной.

Я решил свою общую цель (я пытался объединить несколько строк столбцов вместе), но меня беспокоит, что я несколько озадачен этими сбоями.

Основной целью для справки было уметь

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

и я тоже не понимаю, почему это не работает

особенно с тех пор

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

1 Ответ

1 голос
/ 03 апреля 2019

Там много чего можно распаковать.

    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, которая требует числовых типов. Вы можете использовать любое из следующих действий, чтобы исправить это (что, я думаю, скрытно зависит от способности numpy обрабатывать объекты dtypes, в которые их преобразовывает панда):

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

Далее, эти два элемента говорят ось = 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))

... объединяет элементы в индексе одной группы, которая присутствует вместо отдельной серии. Проверьте:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...