如何使用Pandas获得平均增值?

2024-10-01 05:05:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图计算出表中每列增加值的平均值。你知道吗

我的桌子

 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)pct_change()创建的图表的位置0处的NaN替换为0。gt(0)根据该索引处的值是否大于0,返回true或false表格

此功能的电流输出

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

从我对pandas的有限理解来看,应该有一种方法返回一个包含所有为真的索引的数组,然后使用for循环并遍历原始数据表,但我相信pandas应该有一种不使用for循环的方法。你知道吗

我认为for循环的方式看起来是加上缺少的代码,所以返回的索引是真的,而不是每个索引

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循环的情况下实现所需的输出?你知道吗


Tags: answeringtdffordatavalue数字
2条回答

您可以使用mask()diff()

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

收益率:

A    75.0
B     0.0
C    10.0
dtype: float64

怎么样

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

相关问题 更多 >