Python 如何计算dataframe中特定列的平均值?

Python 如何计算dataframe中特定列的平均值?,python,pandas,Python,Pandas,我有一个数据帧,它的值类型为:object。数据帧还包含NaN值。我想忽略NaN值,对于列中的所有剩余值,我想计算平均值 平均值计算如下: 上限值=30 下限值=0 (上界和下界是固定的,所有值都需要根据它们进行计算。) 所以 对于'>20',平均值=(20+30)/2=25 对于'>1',平均值=(30+1)/2=15.5 对于',可能有更好的方法,但这也有效: df['num'] = df.column1.str.extract('(\d+)') df['sign'] = df.colum

我有一个数据帧,它的值类型为:
object
。数据帧还包含
NaN
值。我想忽略
NaN
值,对于列中的所有剩余值,我想计算平均值

平均值计算如下: 上限值=30 下限值=0

(上界和下界是固定的,所有值都需要根据它们进行计算。)

所以

  • 对于'>20',平均值=(20+30)/2=25

  • 对于'>1',平均值=(30+1)/2=15.5


  • 对于',可能有更好的方法,但这也有效:

    df['num'] = df.column1.str.extract('(\d+)')
    df['sign'] = df.column1.str.extract('([<>])').fillna('=')
    
    def get_avg(row):
        if not row.num:
            return row.num
        elif row.sign == '>':
            return (int(row.num)+30)/2
        elif row.sign == '>':
            return (int(row.num)+0)/2
        else:
            return row.num
    
    df['avg'] = df.apply(lambda row: get_avg(row), axis=1)
    
    df['num']=df.column1.str.extract('(\d+))
    df['sign']=df.column1.str.extract(“([])).fillna(“=”)
    def get_平均值(世界其他地区):
    如果不是row.num:
    返回row.num
    elif row.sign=='>':
    返回(int(row.num)+30)/2
    elif row.sign=='>':
    返回(int(row.num)+0)/2
    其他:
    返回row.num
    df['avg']=df.apply(lambda行:get_avg(行),轴=1)
    
    输出:

      column1 sign  num   avg
    0     >20    >   20    25
    1     NaN    =  NaN   NaN
    2      <5    <    5     5
    3      12    =   12    12
    4      >1    >    1  15.5
    5     <10    <   10    10
    6     NaN    =  NaN   NaN
    7       8    =    8     8
    
    0    25.0
    1     NaN
    2     2.5
    3    12.0
    4    15.5
    5     5.0
    6     NaN
    7     8.0
    
       column1  column2   Avg
    0     20.0     30.0  25.0
    1      NaN      NaN   NaN
    2      5.0      0.0   2.5
    3     12.0     12.0  12.0
    4      1.0     30.0  15.5
    5     10.0      0.0   5.0
    6      NaN      NaN   NaN
    7      8.0      8.0   8.0
    
    column1符号数平均值
    0     >20    >   20    25
    1楠=楠楠楠
    2      1    >    1  15.5
    
    5您可以编写一个函数来计算“自定义平均值”,然后在列上调用apply

    x = np.array([['>20'],[np.NaN],['<5'],['>1'],['<10'],[np.NaN]])
    df = pd.DataFrame(x,columns=["column1"])
    def myFunc(content, up, low):
        try:
            if content.isnumeric(): return float(content)
            return {
                '>': (float(content[1:])+up)/2,
                '<': (float(content[1:])+low)/2
            }[content[0]]
        except:
            return np.nan
    
    df["avg"] = df.column1.apply(lambda x: myFunc(x, up=30, low=0))
    
    x=np.array([['>20'],[np.NaN],[1'],['':(float(content[1:])+up)/2,
    
    下面的代码应用了一个自定义函数,该函数检查每个元素的第一个字符,并根据该字符计算平均值

    import numpy as np
    import pandas as pd
    upper = 30
    lower = 0
    
    df = pd.DataFrame({'col1':['>20',np.NaN,'<5','12','>1','<10',np.NaN,'8']})
    def avg(val):
        if val is not np.NaN:
            char = val[0]
            if char == '>':
                res = (float(val[1:])+upper)/2
            elif char == '<':
                res = (float(val[1:])+lower)/2
            else:
                res = float(val)
            return res
    
    print(df["col1"].apply(avg))
    

    您可以使用
    np。选择
    指定要进行平均的值。然后,在将column1转换为数字后,您可以进行平均

    import pandas as pd
    import numpy as np
    
    lt = df[df.column1.notnull()].column1.str.contains('<')
    gt = df[df.column1.notnull()].column1.str.contains('>')
    
    conds = [lt, gt, ~(lt | gt)]
    choice = [0, 30, pd.to_numeric(df[df.column1.notnull()].column1, errors='coerce')]
    
    df.loc[df.column1.notnull(), 'column2'] = np.select(conds, choice)
    df['column1'] = pd.to_numeric(df.column1.str.replace('<|>', ''))
    
    df['Avg'] = df.mean(axis=1)
    

    这些是你列中仅有的4个数值吗?无法理解你的数字来自何处。请举例说明你的数据是什么。此外,看起来你在根据某些条件计算平均值,它们是什么?@Yuca我的上限和下限值是固定的,列中几乎有18k行。因此我所显示的数据只是其中的一个子集。@gaganso否该列有18k行,所有值都是字符串,我需要将它们转换为数值。@gaganso Check editedquestion@stonerock,请立即尝试。而不是转换NaN值(缺少值)在字符串中,我们可以添加if语句来检查
    val!=NaN
    @stonerock,是的。这样更好。您的答案非常有用,也很容易理解。谢谢兄弟:)
    import pandas as pd
    import numpy as np
    
    lt = df[df.column1.notnull()].column1.str.contains('<')
    gt = df[df.column1.notnull()].column1.str.contains('>')
    
    conds = [lt, gt, ~(lt | gt)]
    choice = [0, 30, pd.to_numeric(df[df.column1.notnull()].column1, errors='coerce')]
    
    df.loc[df.column1.notnull(), 'column2'] = np.select(conds, choice)
    df['column1'] = pd.to_numeric(df.column1.str.replace('<|>', ''))
    
    df['Avg'] = df.mean(axis=1)
    
       column1  column2   Avg
    0     20.0     30.0  25.0
    1      NaN      NaN   NaN
    2      5.0      0.0   2.5
    3     12.0     12.0  12.0
    4      1.0     30.0  15.5
    5     10.0      0.0   5.0
    6      NaN      NaN   NaN
    7      8.0      8.0   8.0