Рассчитать среднее значение списков в DataFrame, игнорируя пустые - PullRequest
0 голосов
/ 01 мая 2019

У меня есть датафрейм, который выглядит так:

               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 ]

1 голос
/ 01 мая 2019

Один из способов - использовать понимание списка и вычислить 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
1 голос
/ 01 мая 2019

хорошо, это работает для меня

                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
0 голосов
/ 01 мая 2019
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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...