马尔可夫链 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
另一个问题是只有 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
您可以先将数据框转换为数值,然后将每行的 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
众所周知,所有概率的总和都需要为 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
另一个问题是只有 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
您可以先将数据框转换为数值,然后将每行的 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