Как рассчитать и перераспределить значения Numeri c между несколькими фреймами данных в Python? - PullRequest
0 голосов
/ 30 марта 2020

Я пытаюсь выяснить, как перераспределить числовые значения между несколькими кадрами данных на основе определенных критериев, я не уверен, как именно go об этом.

Для этой цели я создал 3 небольших выборки DataFrames.

import pandas as pd

first = {'id_1': ['a','b','c'],
         'stock_1': [7,2,3]}

df1 = pd.DataFrame(first, columns = ['id_1','stock_1'])

print(df1)

second = {'id_2': ['a','b','c'],
         'stock_2': [1,2,6]}

df2 = pd.DataFrame(second, columns = ['id_2','stock_2'])

print(df2)

third = {'id_3': ['a','b','c'],
         'stock_3': [5,6,1]}

df3 = pd.DataFrame(third, columns = ['id_3','stock_3'])

print(df3)

   id_1  stock_1
0    a        7
1    b        2
2    c        3

  id_2  stock_2
0    a        1
1    b        2
2    c        6

  id_3  stock_3
0    a        5
1    b        6
2    c        1

Теперь я пытаюсь выяснить, как написать функцию, которая будет перепроверять все значения для всех 3 элементов и перераспределять их таким образом, чтобы искать MAX и MIN (a, b, c), затем вычитает из MAX и добавляет к MIN до AVG.

Я бы хотел, чтобы результирующие таблицы выглядели примерно так:

  id_1  stock_1
0    a        4
1    b        3
2    c        3

  id_2  stock_2
0    a        4
1    b        3
2    c        4

  id_3  stock_3
0    a        5
1    b        4
2    c        3

Если мы смотрим на элемент 'a' в все 3 кадра данных мы получаем значения; 7, 1, 5, где 7 - МАКС, а 1 - МИН.

AVG, когда округление равно (7 + 1 + 5) / 3 = 4

, поэтому для добавления правильной суммы к MIN необходимо знать разницу между AVG и MIN

(AVG - MIN) = (4-1) = 3 давайте назовем его DIF

, поэтому я думаю, что мы должны добавить DIF к MIN

(DIF + MIN) = (3 +1) = 4

и вычтите DIF из MAX, чтобы получить новые значения

(MAX - DIF) = (7-3) = 4

1 Ответ

0 голосов
/ 30 марта 2020

Первое, что нам нужно сделать, это собрать все данные в одном месте. Для удобства я бы начал с установки индекса для каждого DataFrame, но вы можете обойти это, если это действительно важно для вас.

df1.set_index('id_1',inplace=True)
df2.set_index('id_2',inplace=True)
df3.set_index('id_3',inplace=True)

Чтобы собрать все данные вместе, мы просто объединяем все:

joined = df1.join(df2).join(df3)
print(joined)

Это печатает:

      stock_1  stock_2  stock_3
id_1                           
a           7        1        5
b           2        2        6
c           3        6        1

Для удобства я транспонирую матрицу (это позволяет использовать ось по умолчанию для операций)

final_df = joined.T

Для Если вы задали c вычисление, вы можете просто добавить результаты min, max и mean, например:

diff = final_df.mean().round()-final_df.min()
...