如何合并Pandas DataFrame数据并计算统计值(去除NaN)
问题原因
你遇到的NaN是因为iloc取的两部分数据来自不同列,concat时会保留原列名,导致合并后的DataFrame有两列,每列只有4个有效值,其余都是NaN。另外你写的numeric_only=int是错误用法,这个参数需要传布尔值True/False,不是int类型,这也是均值计算失败的原因之一。
解决方案
方案1:合并成无NaN的一维数据(列表/Series)
直接把两部分数据提取成一维格式,再合并,这样就不会有NaN:
# 取数据时用单索引(避免得到二维DataFrame) n1 = df.iloc[0:4, 2] # 得到单列Series n2 = df.iloc[4:8, 13] # 注意:原代码4:9会取5行,你说总共有8个值,所以应该是4:8(左闭右开) # 合并成一个Series total = pd.concat([n1, n2], axis=0) # 计算均值 mean = total.mean()
如果要转成普通列表,直接用total.tolist()即可。
方案2:直接计算统计值,无需合并
不用合并数据,直接对两部分数据的集合计算均值:
mean = pd.concat([df.iloc[0:4,2], df.iloc[4:8,13]]).mean()
或者用numpy直接计算:
import numpy as np mean = np.mean(np.concatenate([df.iloc[0:4,2].values, df.iloc[4:8,13].values]))
方案3:修复原合并代码,处理NaN后计算
如果一定要保留原DataFrame结构,可以先把两列的数据合并到同一列,再去掉NaN:
n1 = df.iloc[0:4,2:3] n2 = df.iloc[4:8,13:14] # 把n2的列名改成和n1一致,再合并 n2.columns = n1.columns total = pd.concat([n1, n2], axis=0) # 去掉NaN后计算均值 mean = total.dropna().mean()
或者直接在计算均值时忽略NaN(Pandas的mean默认就忽略NaN,只要列是数值型):
# 注意numeric_only传True,不是int mean_cols = total.mean(axis=0, numeric_only=True) # 若要整体所有有效值的均值,拉平后计算 mean_total = total.stack().mean()
内容的提问来源于stack exchange,提问作者St. Jimmy
相关产品推荐
相关产品推荐

