Python Pandas按行计算方差返回NaN问题求助
问题解决方法
你用df.var(axis=1)得到NaN的原因有两个:
df.var(axis=1)仅支持对数值型列按行计算方差,但你的b列是列表对象,pandas无法将其识别为可计算的数值数组,计算时会直接忽略该列;- 单独的
a列是单个数值,单值的方差因自由度为0无法计算,返回NaN。
根据你的需求,分两种情况给出解决方案:
情况1:计算b列中每个列表的方差
使用apply结合numpy.var处理,同时兼容单元素列表的场景:
import pandas as pd import numpy as np df = pd.DataFrame({"a" : [1,2,3], "b" : [[1,2],[2,3,4],[5]]}) # 计算总体方差,单元素列表返回0(可根据需求改为np.nan) df['b_var'] = df['b'].apply(lambda x: np.var(x) if len(x) >= 2 else 0) # 如果需要样本方差(自由度为n-1),修改为: # df['b_var_sample'] = df['b'].apply(lambda x: np.var(x, ddof=1) if len(x) >=2 else 0)
执行后结果:
a b b_var 0 1 [1, 2] 0.25 1 2 [2, 3, 4] 0.666667 2 3 [5] 0.0
情况2:合并a列数值与b列列表,计算每行的整体方差
先将每行的a值与b列表合并为新列表,再计算方差:
df['combined_var'] = df.apply( lambda row: np.var([row['a']] + row['b']) if len([row['a']] + row['b']) >=2 else 0, axis=1 )
执行后结果:
a b combined_var 0 1 [1, 2] 0.111111 1 2 [2, 3, 4] 0.5 2 3 [5] 0.0
内容的提问来源于stack exchange,提问作者MMM
相关产品推荐
相关产品推荐

