Pandas中具有多索引的Arraylike操作?

2024-10-01 02:26:06 发布

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

我有一个具有多索引的透视表,其中一个级别是“字段”(数据实际上是什么),另一个级别在概念上是实际索引。我想对数据进行一些转换,例如,获取自然日志,并将转换后的值添加为一组行。例如:

      col   1   2   3   4 ... 100
field idx   
foo   A     7   9   2   5 ... 47
      B     8   3   4   8 ... 82
      C     3   6   1   9 ... 23
bar   A     1   17  5   2 ... 32
      B     7   5   4   8 ... 78
      C     28  6   11  3 ... 11

应成为:

      col   1   2   3   4 ... 100
field idx   
foo   A     7   9   2   5 ... 47
      B     8   3   4   8 ... 82
      C     3   6   1   9 ... 23
bar   A     1   17  5   2 ... 32
      B     7   5   4   8 ... 78
      C     28  6   11  3 ... 11
lnfoo A     <element-wise>
      B     <natural logs>
      C     <of foo>

有没有一种简单的方法可以在这样的多索引透视表上执行这种数组范围的操作?尤其是不需要迭代数据帧的行

对熊猫来说很新鲜,如果这是个愚蠢的问题,我很抱歉


Tags: of数据方法概念fieldfoobarcol
2条回答

另一个解决方案:

tmp = df.query('field == "foo"').rename(index={'foo': 'lnfoo'})
pd.concat([df, np.log(tmp)])

您可以很容易地将其扩展到bar

tmp = df.query('field in ("foo", "bar")').rename(index={'foo': 'lnfoo', 'bar': 'lnbar'})
pd.concat([df, np.log(tmp)])

要将日志应用于完整的foo索引级别,可以使用loc一次选择所有行,并使用np.log执行示例操作

#example data
np.random.seed(10)
df = pd.DataFrame(np.random.randint(1,50,30).reshape(6,-1), 
                  index=pd.MultiIndex.from_product([['foo','bar'], list("ABC")], 
                                                   names=['field', 'idx']))

print(np.log(df.loc['foo']))
            0         1         2         3         4
idx                                                  
A    2.302585  3.610918  2.772589  0.000000  3.367296
B    3.258097  3.401197  3.891820  3.401197  2.197225
C    2.302585  0.000000  3.761200  3.713572  3.610918

如您所见,level字段不在结果中,您需要使用pd.concat和字典以及要创建的级别名称重新创建此级别。然后再次使用pd.concat将其添加到df的末尾

df = pd.concat([df, 
                pd.concat({'logfoo': np.log(df.loc['foo'])}, 
                          names=['field'])
               ])
print(df)
                    0          1          2          3          4
field  idx                                                       
foo    A    10.000000  37.000000  16.000000   1.000000  29.000000
       B    26.000000  30.000000  49.000000  30.000000   9.000000
       C    10.000000   1.000000  43.000000  41.000000  37.000000
bar    A    17.000000  37.000000  48.000000  12.000000  25.000000
       B    44.000000  34.000000   9.000000  37.000000  15.000000
       C    14.000000   6.000000  14.000000  26.000000  14.000000
logfoo A     2.302585   3.610918   2.772589   0.000000   3.367296
       B     3.258097   3.401197   3.891820   3.401197   2.197225
       C     2.302585   0.000000   3.761200   3.713572   3.610918

相关问题 更多 >