问题描述
众所周知,所有概率的总和需要为 1。我确实有一个 Pandas Dataframe,其中有时会遗漏一个事件的概率。
因为我知道一行的所有元素都需要总结为一个。我想用计算出的值替换 Nan。
对我的 Pandas 数据框中的每一行进行如下处理
for item,row in df:
df.replace(Nan,(1-sum of row())
举个例子,这是我现在用作测试数据的数组:
matrixsum
e f g
a 0.3 0.2 Nan
b 0.2 0.2 0.6
c 0.7 0.1 Nan
通过使用 df.fillna(0) 我确实得到了这个:
matrixsum
e f g
a 0.3 0.2 0.0
b 0.2 0.2 0.6
c 0.7 0.1 0.0
另一个问题是,只有具有 float
或 int
格式的行才能求和为 1,但 nan
具有字符串格式。目前我只使用 df.fillna(0)
但这是一件坏事。
预期输出:
matrixsum
e f g
a 0.3 0.2 0.5
b 0.2 0.2 0.6
c 0.7 0.1 0.2
解决方法
如果您确定所有行的 Nan
始终出现在单个列中(假设为 g
),您可以这样做:
考虑以下df
:
In [21]: df
Out[21]:
e f g
a 0.3 0.2 Nan
b 0.2 0.2 0.6
c 0.7 0.1 Nan
In [22]: df['g'] = 1 - df.sum(1)
In [23]: df
Out[23]:
e f g
a 0.3 0.2 0.5
b 0.2 0.2 0.6
c 0.7 0.1 0.2
,
您可以先将数据框转换为数值,然后用 1- row.sum()
填充每行的 NaN:
df = df.apply(pd.to_numeric,errors="coerce")
df = df.apply(lambda row: row.fillna(1 - row.sum()),axis=1)
或者等效地,您可以将这两者组合在一个函数中:
def markovize(row):
row = pd.to_numeric(row,errors="coerce")
return row.fillna(1 - row.sum())
df = df.apply(markovize,axis=1)
之前:
e f g
a 0.3 0.2 Nan
b 0.2 0.2 0.6
c 0.7 0.1 Nan
之后:
e f g
a 0.3 0.2 0.5
b 0.2 0.2 0.6
c 0.7 0.1 0.2