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您可以编写一个函数来计算“自定义平均值”,然后在列上调用applyx = 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))
您可以使用
指定要进行平均的值。然后,在将column1转换为数字后,您可以进行平均np。选择
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语句来检查
@stonerock,是的。这样更好。您的答案非常有用,也很容易理解。谢谢兄弟:)val!=NaN
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