【问题标题】:Repair Data for Markov Chain Monte Carlo Simulation马尔可夫链蒙特卡罗模拟的修复数据
【发布时间】:2021-04-26 13:01:41
【问题描述】:

众所周知,所有概率的总和都需要为 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 在哪里?请分享一个具有预期输出的合适的。
  • 感谢您的建议,我确实更改了问题并尝试实施您要求的事情。
  • 如果一行包含 2 个 nan 会发生什么?
  • 如果一行包含多个nan,则没有解决方案,并且无法修复数据。但我想减少用户必须输入的数据量。

标签: python-3.x pandas dataframe markov-chains


【解决方案1】:

如果您确定所有行的 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

【讨论】:

  • 缺失值随机分布在整个数据集中。因此,您的解决方案现在并不能真正解决我的问题,但我可以想象其他人可能对此感到非常高兴。也许我应该在我的问题中澄清这一点,所以这是我的错。感谢您的 Efford 和您对改进我的问题文本的帮助。
【解决方案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

【讨论】:

  • 我确实尝试过这个解决方案,据我所知,它确实对我有用。我想我会在明天进行更多的兼容性检查后接受答案。感谢您的帮助,祝您晚上愉快。
猜你喜欢
  • 2014-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多