马尔可夫链 Monte Carlo 模拟的修复数据

Repair Data for Markov Chain Monte Carlo Simulation

众所周知,所有概率的总和都需要为 1。我确实有一个 Pandas 数据框,其中有时一个事件的概率确实会丢失。
因为我知道一行的所有元素都需要加起来为一个。我想用计算值替换 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

您可以先将数据框转换为数值,然后将每行的 NaN 填充为 1- row.sum():

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