У меня есть фрейм данных, который выглядит так:
A
1 [67.0, 51.0, 23.0, 49.0, 3.0]
2 0
3 [595.0]
4 0
5 [446.0, 564.0, 402.0]
6 0
7 0
Я хотел бы найти среднее значение для каждого списка, игнорируя нули. Я хочу получить что-то вроде:
A Mean
1 [67.0, 51.0, 23.0, 49.0, 3.0] 38.6
2 0 0
3 [595.0] 595.0
4 0 0
5 [446.0, 564.0, 402.0] 470.7
6 0 0
7 0 0
Я перепробовал много возможных решений, перечисленных здесь, и ни одно из них не сработало. Это то, что я пробовал до сих пор:
df['Mean'] = df.A.apply(lambda x: mean(x))
Что дает мне эту ошибку
TypeError: объект 'int' не повторяется
Также это
df['Mean'] = df['A'].mean(axis=1)
ValueError: нет оси с именем 1 для типа объекта
Попробовал и это, не повезло:
a = np.array( df['A'].tolist())
a.mean(axis=1)
mean(d for d in a if d)
Могу ли я попробовать что-нибудь еще, что дало бы мне ожидаемый результат? Спасибо за вашу помощь.
3 ответа
from collections.abc import Iterable
import numpy as np
def calculate_mean(x):
if isinstance(x["A"], Iterable):
x["mean"] = np.mean(x["A"])
else:
x["mean"] = x["A"]
return x
df = df.apply(lambda x: calculate_mean(x), axis=1)
Редактировать -
df["mean"] = df.apply(lambda x: np.mean(x["A"]), axis=1)
Хорошо, это работает для меня
A
1 [67.0, 51.0, 23.0, 49.0, 3.0]
2 0
3 [595.0]
4 0
5 [446.0, 564.0, 402.0]
6 0
7 0
Используя np.mean
data['A'].apply(lambda x: np.mean(eval(x)))
Вывод
A Mean
1 [67.0, 51.0, 23.0, 49.0, 3.0] 38.600000
2 0 0.000000
3 [595.0] 595.000000
4 0 0.000000
5 [446.0, 564.0, 402.0] 470.666667
6 0 0.000000
7 0 0.000000
Один из способов - использовать понимание списка и вычислить mean
где данная строка представляет собой список, который можно проверить с помощью isinstance
. Это необходимо, иначе вы получите:
TypeError: объект 'int' не повторяется
Так как функция ожидает повторяемость. Так что вы можете сделать:
from statistics import mean
df['mean'] = [mean(i) if isinstance(i, list) else i for i in df.A]
A mean
0 [67.0, 51.0, 23.0, 49.0, 3.0] 38.600000
1 0 0.000000
2 [595.0] 595.000000
3 0 0.000000
4 [446.0, 564.0, 402.0] 470.666667
5 0 0.000000
6 0 0.000000
Или вы также можете использовать np.mean
который обрабатывает как ints
, так и итерации:
import numpy as np
df['mean'] = df.A.map(np.mean)
A mean
0 [67.0, 51.0, 23.0, 49.0, 3.0] 38.600000
1 0 0.000000
2 [595.0] 595.000000
3 0 0.000000
4 [446.0, 564.0, 402.0] 470.666667
5 0 0.000000
6 0 0.000000
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.