pandas add 方法中的“level”参数如何工作

问题描述 投票:0回答:1

我已经看到了

level
方法
pd.DataFrame
add
sub
div
mul
参数。 文档指出:

级别:整数或名称

跨级别广播,匹配传递的多索引级别上的索引值

我似乎无法理解如何正确使用它。

考虑:

import pandas as pd
import numpy as np

df = pd.DataFrame(np.arange(8).reshape(4, 2),
                  pd.MultiIndex.from_product([['A', 'B'], ['one', 'two']]),
                  list('ab'))

df

       a  b
A one  0  1
  two  2  3
B one  4  5
  two  6  7

如果我加 100,我就会得到我所期望的结果。

level
参数没有相关性。

pd.concat([df, df.add(100), df.add(100, level=0), df.add(100, level=1)],
          axis=1, keys=['Original', 'No Level', 'Level 0', 'Level 1'])


      Original    No Level      Level 0      Level 1     
             a  b        a    b       a    b       a    b
A one        0  1      100  101     100  101     100  101
  two        2  3      102  103     102  103     102  103
B one        4  5      104  105     104  105     104  105
  two        6  7      106  107     106  107     106  107

但我认为添加数组会很独特。

a = np.arange(2) + 100

pd.concat([df, df.add(a), df.add(a, level=0), df.add(a, level=1)],
          axis=1, keys=['Original', 'No Level', 'Level 0', 'Level 1'])

      Original    No Level      Level 0      Level 1     
             a  b        a    b       a    b       a    b
A one        0  1      100  102     100  102     100  102
  two        2  3      102  104     102  104     102  104
B one        4  5      104  106     104  106     104  106
  two        6  7      106  108     106  108     106  108

level
没有区别。

我期待类似的事情:

df.groupby(level=0).apply(lambda df: df.add(a, axis=0))

         a    b
A one  100  101
  two  103  104
B one  104  105
  two  107  108

有人可以给出如何以及何时使用此参数的具体示例吗?

python pandas
1个回答
0
投票

示例已添加到文档

示例

>>> df = pd.DataFrame({'angles': [0, 3, 4],
...                    'degrees': [360, 180, 360]},
...                   index=['circle', 'triangle', 'rectangle'])
>>> df
           angles  degrees
circle          0      360
triangle        3      180
rectangle       4      360

[...]

按级别除以 MultiIndex。

>>> df_multindex = pd.DataFrame({'angles': [0, 3, 4, 4, 5, 6],
...                              'degrees': [360, 180, 360, 360, 540, 720]},
...                             index=[['A', 'A', 'A', 'B', 'B', 'B'],
...                                    ['circle', 'triangle', 'rectangle',
...                                     'square', 'pentagon', 'hexagon']])
>>> df_multindex
             angles  degrees
A circle          0      360
  triangle        3      180
  rectangle       4      360
B square          4      360
  pentagon        5      540
  hexagon         6      720
>>> df.div(df_multindex, level=1, fill_value=0)
             angles  degrees
A circle        NaN      1.0
  triangle      1.0      1.0
  rectangle     1.0      1.0
B square        0.0      0.0
  pentagon      0.0      0.0
  hexagon       0.0      0.0

与没有

level
的结果进行比较:

>>> df.div(df_multindex, fill_value=0)
...
ValueError: cannot join with no overlapping index names

还有一个索引名称重叠的版本:

>>> df.rename_axis('shape').div(
...     df_multindex.rename_axis(['group', 'shape']),
...     fill_value=0)
                 angles  degrees
group shape                     
A     circle        NaN      1.0
      triangle      1.0      1.0
      rectangle     1.0      1.0
B     square        0.0      0.0
      pentagon      0.0      0.0
      hexagon       0.0      0.0
© www.soinside.com 2019 - 2024. All rights reserved.