Python или Pandas Суммирование данных (преобразование таблицы в словарь row_name: [col_name, value] ....) - PullRequest
0 голосов
/ 07 августа 2020

Пожалуйста, найдите данные ниже, где название индекса повторяется от 3 до 5 раз, поскольку ежемесячный отчет неправильно консолидировался за 3 месяца, прежде чем был передан мне.

Name    Score   Rating
Peralta 0   40
Peralta 20  0
Peralta 0   0
Amy 0   40
Amy 20  40
Amy -20 40
Terry   0   0
Terry   -20 40
Terry   0   -40
Gina    20  0
Gina    0   0
Gina    -20 40

Я до сих пор работал с только вытягивание имени столбца, как показано в коде в конце. Но я не могу объединить «Имя столбца» и «Значение ячейки» .

Мне нужно суммировать данные в следующем формате: ( в результатах могут быть табуляторы или запятые, в зависимости от вашего удобства.)

### Final Result
# IndexName [col_name, cell_value]  [sum of positive numbers, result] [sum of negative numbers, result]


Peralta [Rating, 40]    [Score, 20]     [Sum_Total_of_positive_numbers, 60]
Amy     [Rating, 40]    [Score, 20]     [Rating, 40]    [Score, -20]    [Rating, 40]    [Sum_Total_of_positive_numbers, 140]    [Sum_Total_of_negative_numbers, -20]
Terry   [Score, -20]    [Rating, 40]    [Rating, -40]   [Sum_Total_of_positive_numbers, 40] [Sum_Total_of_negative_numbers, -60]
Gina    [Score, 20]     [Score, -20]    [Rating, 40]    [Sum_Total_of_positive_numbers, 60] [Sum_Total_of_negative_numbers, -20]

Все стандартные pandas функции для суммирования данных не помогли, и / или другие библиотеки, доступные для вывода сводки в Приведенный выше формат не существует.

Следующий код действительно помог уменьшить имя столбца, но тогда значение ячейки, относящееся к этому столбцу + строке, не входит ..

for k, v in dff_dict.items():               # k: name of index, v: is a df
    check = v.columns[(v == 20).any()]
    if len(check) > 0:
        print((k, check.to_list()), file=open("output.txt", "a"))

Можно ли каким-то образом достичь «Окончательного результата» , как показано во 2-й таблице, пожалуйста? (конечный результат не обязательно в каком-либо конкретном формате, например, в фрейме данных или таблице) Спасибо ..

Примечание:

Исходные данные могут содержать более 20 столбцов и сотни строк , но я упростил данные, поэтому, пожалуйста, не ограничивайтесь только несколькими строками или столбцами. '

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

Здесь есть полезная статья (Ближайший возможный ответ) , но тогда мне нужно [имя_столбца, значение], в отличие от только [ строка: значение]

1 Ответ

1 голос
/ 08 августа 2020

Я думаю, это будет проще, если вы можете разделить общий набор данных на два, учитывая требование «раздельная сумма положительных и отрицательных чисел».

Начиная с ваших данных образца:

import pandas as pd
import numpy as np
data = [
{"Name": "Peralta", "Score": 0, "Rating": 40},
{"Name": "Peralta", "Score": 20, "Rating": 0},
{"Name": "Peralta", "Score": 0, "Rating": 0},
{"Name": "Amy", "Score": 0, "Rating": 40},
{"Name": "Amy", "Score": 20, "Rating": 40},
{"Name": "Amy", "Score": -20, "Rating": 40},
{"Name": "Terry", "Score": 0, "Rating": 0},
{"Name": "Terry", "Score": -20, "Rating": 40},
{"Name": "Terry", "Score": 0, "Rating": -40},
{"Name": "Gina", "Score": 20, "Rating": 0},
{"Name": "Gina", "Score": 0, "Rating": 0},
{"Name": "Gina", "Score": -20, "Rating": 40},
]
df = pd.DataFrame(data).set_index("Name")

мы можем получить положительные и отрицательные прогнозы для работы с:

df_pos = df.where(df>=0, other=0)
df_neg = df.where(df<0, other=0)

, а затем сгруппировать и суммировать, чтобы получить желаемые результаты:

df_pos = df_pos.groupby(by="Name").sum()
df_pos["total_positive"] = df_pos.apply(np.sum, axis=1)

df_neg = df_neg.groupby(by="Name").sum()
df_neg["total_negative"] = df_neg.apply(np.sum, axis=1)

Примечание - на этом этапе данные по-прежнему находятся в двух фреймах данных, не сведенных в формат [field, value], который вы показали.

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