#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)