Как мне создать фрейм данных из столбцов и уникальных значений, сложенных?

#pandas #data-manipulation

#pandas #манипулирование данными

Вопрос:

У меня есть большой фрейм данных, из которого я хотел бы создать таблицу суммирования. Другими словами, столбец 1 будет столбцами первого фрейма данных, столбец 2 будет представлять собой каждое уникальное значение каждого столбца и третьего столбца… это будет суммирование различных переменных, которые я выбираю. Как показано ниже:

 Variable   Level   Summed_Column
 

Вот несколько примеров кода:

 data = {"name": ['bob', 'john', 'mary', 'timmy']
       , "age": [32, 32, 29, 28]
       , "location": ['philly', 'philly', 'philly', 'ny']
       , "amt": [100, 2000, 300, 40]}

df = pd.DataFrame(data)

df.head()
 

Итак, результат в приведенном выше примере будет следующим:

 Variable     Level     Summed_Column
Name         Bob       100
Name         john      2000
Name         Mary      300
Name         timmy     40
age          32        2100
age          29        300
age          29        40
location     philly    2400
location     ny        40
 

Я даже не уверен, с чего начать. Фактический фрейм данных содержит 32 столбца, в которых 4 будут суммированы, а 28 помещены в формат variable и. Level

Комментарии:

1. Вы изучали pd.melt ? Не уверен на 100%, но это может быть полезно здесь

2. Спасибо @Datanovice. Я пробовал pd.melt , но, похоже, он дублирует значения. Мне нужны уникальные значения для каждой переменной и суммирование других столбцов.

Ответ №1:

Для этого вам не нужен цикл и конкатенация, вы можете сделать это за один раз, объединив melt groupby и используя agg метод:

 final = df.melt(value_vars=['name', 'age', 'location'], id_vars='amt')
          .groupby(['variable', 'value']).agg({'amt':'sum'})
          .reset_index()
 

Что дает:

 print(final)
   variable   value   amt
0       age      28    40
1       age      29   300
2       age      32  2100
3  location      ny    40
4  location  philly  2400
5      name     bob   100
6      name    john  2000
7      name    mary   300
8      name   timmy    40
 

Комментарии:

1. да, это намного чище. Спасибо.

Ответ №2:

хорошо @Datanovice. Я выяснил, как это сделать, используя цикл for w / pd.melt .

 id = ['name', 'age', 'location']

final = pd.DataFrame(columns = ['variable', 'value', 'amt'])

for i in id:
    table = df.groupby(i).agg({'amt':'sum'}).reset_index()
    table2 = pd.melt(table, value_vars = i, id_vars = ['amt'])
    final = pd.concat([final, table2])

print(final)