马尔可夫链蒙特卡罗模拟的修复数据

问题描述

众所周知,所有概率的总和需要为 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

一个问题是,只有具有 floatint 格式的行才能求和为 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