Панды сгруппированы и суммируются с другими данными - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть словарь, в котором ключ - это имя файла, а значения - это кадры данных, которые выглядят так:

col1     col2
A        10
B        20
A        20 
A        10
B        10

Я хочу сгруппировать на основе 'col1' для суммирования значений в 'col2' и сохранить его в новом фрейме данных 'df', чей вывод должен выглядеть следующим образом:

Вывод должен выглядеть так:

Index    A      B  
file1     40     30
file2     50     35

Мой код:

df=pd.DataFrame(columns=['A','B'])
for key, value in data.items():

    cnt=(value.groupby('Type')['Packets'].sum())
    print(cnt)

    df.append(cnt,ignore_index=True)

Ответы [ 2 ]

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

Другой предложенный способ с группированием, транспонированием и стеком строк в фрейм данных.

import pandas as pd
import numpy as np

df_1 = pd.DataFrame({'col1':['A', 'B', 'A', 'A', 'B'], 'col2':[10, 20, 20, 10, 10]})
df_2 = pd.DataFrame({'col1':['A', 'B', 'A', 'A', 'B'], 'col2':[30, 10, 15, 5, 25]})
df_1_agg = df_1.groupby(['col1']).agg({'col2':'sum'}).T.values
df_2_agg = df_2.groupby(['col1']).agg({'col2':'sum'}).T.values
pd.DataFrame(np.row_stack((df_1_agg, df_2_agg)), index = ['file1', 'file2']).rename(columns = {0:'A', 1:'B'})

enter image description here

Отредактировано : чтобы обобщить, нужно поместить его в функцию и выполнить цикл. Кроме того, для общих случаев необходимо отформатировать индекс (файл {i}).

lst_df = [df_1, df_2]

df_all = []

for i in lst_df:
    # iterate every data faame
    df_agg = i.groupby(['col1']).agg({'col2':'sum'}).T.values

    # append to the accumulator
    df_all.append(df_agg)

pd.DataFrame(np.row_stack(df_all), index = ['file1', 'file2']).rename(columns = {0:'A', 1:'B'})
0 голосов
/ 05 ноября 2018

Вам следует избегать добавления в цикл. Это неэффективно и не рекомендуется.

Вместо этого вы можете объединить свои фреймы данных в один большой фрейм, а затем использовать pivot_table:

# aggregate values in your dictionary, adding a "file" series
df_comb = pd.concat((v.assign(file=k) for k, v in data.items()), ignore_index=True)

# perform 'sum' aggregation, specifying index, columns & values
df = df_comb.pivot_table(index='file', columns='col1', values='col2', aggfunc='sum')

Объяснение

  • v.assign(file=k) добавляет серию file к каждому фрейму данных со значением, установленным в имя файла.
  • pd.concat объединяет все кадры данных в вашем словаре.
  • pd.DataFrame.pivot_table - это метод Pandas, который позволяет создавать сводные таблицы в стиле Excel путем указания index, columns, values и aggfunc (функция агрегирования).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...