基于4元素列表索引从Python的Pandas数据帧中添加特定的概率

2024-04-19 10:00:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个熊猫数据框,看起来像这样:

               Pr(X,O)
(H, H, H, H)  0.042743
(H, H, H, C)  0.003664
(H, H, C, H)  0.073274
(H, H, C, C)  0.021982
(H, C, H, H)  0.005234
(H, C, H, C)  0.000449
(H, C, C, H)  0.031403
(H, C, C, C)  0.009421
(C, H, H, H)  0.113982
(C, H, H, C)  0.009770
(C, H, C, H)  0.195398
(C, H, C, C)  0.058619
(C, C, H, H)  0.048849
(C, C, H, C)  0.004187
(C, C, C, H)  0.293096
(C, C, C, C)  0.087929

不幸的是,这是由太大的代码生成的,无法在这个问题中发布。注意,我有所有可能的两个元素(HC)作为数据帧索引,它们按四个元素的顺序排列。我的问题是,把每个位置的每个元素的所有数字相加,最好的方法是什么?你知道吗

例如。考虑位置0和元素H。在这里我要总结一下 0.042743 + 0.003664 + 0.073274 + 0.021982 + 0.005234 + 0.000449 + 0.031403 + 0.009421等于0.1887。然后我想在相同的位置对C做同样的处理,然后在所有的位置上都做同样的处理。(很明显我可以用补码,但我想以后用两个字母的字母表再做一次)。你知道吗

一个期望的结果是另一个熊猫数据帧,看起来像这样:

enter image description here


Tags: 数据方法元素字母数字pr代码生成字母表
2条回答

您可以首先从tuples创建新列,然后使用aggfunc=sum创建^{},最后创建^{}

df['a'],df['b'],df['c'],df['d'] = zip(*df.index)

print (df)
               Pr(X,O)  a  b  c  d
(H, H, H, H)  0.042743  H  H  H  H
(H, H, H, C)  0.003664  H  H  H  C
(H, H, C, H)  0.073274  H  H  C  H
(H, H, C, C)  0.021982  H  H  C  C
(H, C, H, H)  0.005234  H  C  H  H
(H, C, H, C)  0.000449  H  C  H  C
(H, C, C, H)  0.031403  H  C  C  H
(H, C, C, C)  0.009421  H  C  C  C
(C, H, H, H)  0.113982  C  H  H  H
(C, H, H, C)  0.009770  C  H  H  C
(C, H, C, H)  0.195398  C  H  C  H
(C, H, C, C)  0.058619  C  H  C  C
(C, C, H, H)  0.048849  C  C  H  H
(C, C, H, C)  0.004187  C  C  H  C
(C, C, C, H)  0.293096  C  C  C  H
(C, C, C, C)  0.087929  C  C  C  C

print (pd.melt(df, id_vars=['Pr(X,O)'])
         .pivot_table(index='value', columns='variable', values='Pr(X,O)', aggfunc=sum))

variable        a         b         c         d
value                                          
C         0.81183  0.480568  0.771122  0.196021
H         0.18817  0.519432  0.228878  0.803979

或者如果需要列名作为int并删除索引和列名,请使用^{}(在pandas0.18.0中新增):

print (pd.melt(df, id_vars=['Pr(X,O)'])
         .pivot_table(index='value', columns='variable', values='Pr(X,O)', aggfunc=sum)
         .rename_axis(None)
         .rename_axis(None, axis=1))

         0         1         2         3
C  0.81183  0.480568  0.771122  0.196021
H  0.18817  0.519432  0.228878  0.803979

我尝试将itertools.product的结果作为一个多索引。你知道吗

index = pd.MultiIndex.from_tuples(itertools.product(('H', 'C'), repeat=4))

然后我们按不同的级别分组,并连接它们。你知道吗

pd.concat( [df.groupby(level=[i]).sum().rename(columns={'Pr(X,O)': i}) for i in range(4)] , axis=1)

         0         1         2         3
C  0.81183  0.480568  0.771122  0.196021
H  0.18817  0.519432  0.228878  0.803979

编辑 多亏了MaxU的评论,不需要将一个多索引作为一个系列对索引进行一些操作。你知道吗

相关问题 更多 >