Python df groupby с agg для строки и суммы - PullRequest
0 голосов
/ 21 ноября 2018

С этим df DF в качестве базы я хочу следующий вывод: resultDF

Таким образом, все должно быть агрегировано по столбцу 0 и все строки издолжен быть добавлен столбец 1, а числа из столбца 2 должны быть суммированы, если строки из столбца 1 имеют одно и то же имя.

С помощью следующего кода я могу объединять строки, но без суммирования чисел:

df2= df1.groupby([0]).agg(lambda x: ','.join(set(x))).reset_index()
df2

uncompleteSolutiondf

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Это похоже на двухэтапный процесс.Также требуется, чтобы каждая группа из столбца 1 имела одинаковое количество уникальных элементов в столбце 2. Сначала сгруппируйте по столбцам, которые вы хотите сгруппировать

df_grouped = df.groupby([0,1]).sum().reset_index()

Затем измените форму на нужную форму:

def group_to_row(group):
    group = group.sort_values(1)
    output = []
    for i, row in group[[1,2]].iterrows():
        output += row.tolist()
    return pd.DataFrame(data=[output])

df_output = df_grouped.groupby(0).apply(group_to_row).reset_index()

Это не проверено, но это также довольно нестандартная форма, поэтому, к сожалению, я не думаю, что для вас есть стандартная функция Pandas.

0 голосов
/ 21 ноября 2018

Избегайте произвольного количества столбцов.

. Требуемый вывод предполагает, что у вас есть произвольное количество столбцов в зависимости от количества значений в 1 для каждой группы 0.Это анти-панды, которые сильно ориентированы на произвольное число рядов .Следовательно, последовательных операций предпочтительнее.

Так что вы можете просто использовать groupby + sum для хранения всей необходимой вам информации.

df = pd.DataFrame({0: ['2008-04_E.pdf']*3,
                   1: ['Mat1', 'Mat2', 'Mat2'],
                   2: [3, 1, 1]})

df_sum = df.groupby([0, 1]).sum().reset_index()

print(df_sum)
               0     1  2
0  2008-04_E.pdf  Mat1  3
1  2008-04_E.pdf  Mat2  2

Но если вы настаиваете ...

Если вы настаиваете на своем необычном требовании, вы можете выполнить его следующим образом через df_sum, рассчитанный, как указано выше.

key = df_sum.groupby(0)[1].cumcount().add(1).map('Key{}'.format)
res = df_sum.set_index([0, key]).unstack().reset_index().drop('key', axis=1)

res.columns = res.columns.droplevel(0)

print(res)
                  Key1  Key2  Key1  Key2
0  2008-04_E.pdf  Mat1  Mat2     3     2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...