Как получить среднее значение столбцов с условием, которое указано? - PullRequest
1 голос
/ 30 апреля 2020

У меня есть фрейм данных, содержащий столбцы (Name, a, b), и я хочу создать имя столбца «mean», которое будет означать среднее для столбцов a и b, но если среднее значение для любых двух строк одинаково, то чей-либо Сумма стоимости должна уменьшиться на 0,1.

   data frame 1

  Name  Sum  a   b      mean
0 hamm   34  2   2       2
1 jam    54  1   1  -->  1
2 tan    36  3   1       2
3 pan    39  4   4       4

, как мы видим, теперь строки 0 и 2 имеют одно и то же среднее значение, поэтому теперь, чье значение суммы больше, должно уменьшиться на 0,1

Здесь, в этом случае, его строка № 2 должно иметь значение 2- 0,1 = 1,9

Конечный результат

  Name  Sum  a   b   mean
0 hamm   34  2   2    2
1 jam    54  1   1    1
2 tan    36  3   1    1.9
3 pan    39  4   4    4

1 Ответ

1 голос
/ 30 апреля 2020

Можно попробовать mean и cumcount:

df.assign(mean = df[["a", "b"]].mean(axis=1))\
  .assign(mean = df["mean"].subtract(df.groupby("mean").cumcount().divide(10)))

выход

#    Name  Sum  a  b  mean
# 0  hamm   34  2  2   2.0
# 1   jam   54  1  1   1.0
# 2   tan   36  3  1   1.9
# 3   pan   39  4  4   4.0

Пояснения :

  1. Вычислите среднее значение, используя mean. Мы указываем axis=1, чтобы вычислить его по строкам.

  2. Для каждого идентичного mean мы хотим вычесть n*0.1.

    1. Мы используем groupby, чтобы сгруппировать все строки с одинаковыми mean
    2. Мы получаем их число, используя cumcount. См. Это обсуждение для получения более подробной информации.
    3. Разделите на 10, используя divide, чтобы преобразовать счетчик в 0.1, 0.2, ...
  3. Вычтите результат из шага 2 в столбец mean, используя subtract


Полный код + иллюстрация


# Step 1
df["mean"] = df[["a", "b"]].mean(axis=1)
print(df)
#    Name  Sum  a  b  mean
# 0  hamm   34  2  2   2.0
# 1   jam   54  1  1   1.0
# 2   tan   36  3  1   2.0
# 3   pan   39  4  4   4.0

# Step 2.1 + 2.2
print(df.groupby("mean").cumcount())
# 0    0
# 1    0
# 2    1
# 3    0
# dtype: int64

# Step 2.3
print(df.groupby("mean").cumcount().divide(10))
# 0    0.0
# 1    0.0
# 2    0.1
# 3    0.0
# dtype: float64

# Step 3
df["mean"] = df["mean"].subtract(df.groupby("mean").cumcount().divide(10))
print(df)
#    Name  Sum  a  b  mean
# 0  hamm   34  2  2   2.0
# 1   jam   54  1  1   1.0
# 2   tan   36  3  1   1.9
# 3   pan   39  4  4   4.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...