Как получить среднее значение при помощи панд? - PullRequest
0 голосов
/ 24 августа 2018

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

мой стол

 A  |  B  |  C
----------------
 0  |  5  |  10
100 |  2  |  20
 50 |  2  |  30
100 |  0  |  40

функция, которую я пытаюсь написать для моей проблемы

def avergeIncreace(data,value):  #not complete but what I have so far
  x = data[value].pct_change().fillna(0).gt(0)
  print( x )  

pct_change() возвращает таблицу процентного значения числа с этим индексом по сравнению с числом в строке перед ним. fillna(0) заменяет NaN в позиции 0 диаграммы, которую pct_change() создает с 0. gt(0) возвращает таблицу true или false в зависимости от того, превышает ли значение этого индекса значение 0

токовый выход этой функции

In[1]:avergeIncreace(df,'A')
Out[1]:  0    False
         1    True
         2    False
         3    True
         Name: BAL, dtyle: bool

желаемый вывод

In[1]:avergeIncreace(df,'A')
Out[1]:75
In[2]:avergeIncreace(df,'B')
Out[2]:0
In[3]:avergeIncreace(df,'C')
Out[3]:10

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

то, что я думаю, выглядит для цикла for плюс отсутствующий код, поэтому возвращаются индексы, которые имеют значение true вместо каждого индекса

avergeIncreace(df,'A')
  indexes = data[value].pct_change().fillna(0).gt(0).index.values  #this returns an array containing all of the index (true and false)
  answer = 0
  times = 0
  for x in indexes:
    answer += (data[value][x] - data[value][x-1])
    times += 1
  print( answer/times ) 

Как добиться желаемого результата без использования цикла for в функции?

Ответы [ 2 ]

0 голосов
/ 24 августа 2018

Вы можете использовать mask() и diff():

df.diff().mask(df.diff()<=0, np.nan).mean().fillna(0)

Выход:

A    75.0
B     0.0
C    10.0
dtype: float64
0 голосов
/ 24 августа 2018

Как насчет

import pandas as pd
import numpy as np

df = pd.DataFrame({'A': [0, 100, 50, 100],
                   'B': [5, 2, 2, 0],
                   'C': [10, 20, 30, 40]})

def averageIncrease(df, col_name):
    # Create array of deltas. Replace nan and negative values with zero
    a = np.maximum(df[col_name] - df[col_name].shift(), 0).replace(np.nan, 0)
    # Count non-zero values
    count = np.count_nonzero(a)

    if count == 0:
        # If only zero values… there is no increase
        return 0
    else:
        return np.sum(a) / count


print(averageIncrease(df, 'A'))
print(averageIncrease(df, 'B'))
print(averageIncrease(df, 'C'))
75.0
0
10.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...