Pandas 多索引数据框中组之间的计算

xia*_*o87 5 python pandas

假设我生成一个多索引数据框如下:

arrays = [np.array(['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux']),
          np.array(['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two'])]
df = pd.DataFrame(np.random.randn(8, 4), index=arrays)

                0          1            2           3
bar one -0.155088   -0.177214   -0.761230   -0.106045
    two  1.930298   -0.309573   -0.051878   -0.388760
baz one  0.111287    1.374426    0.408575    1.555659
    two -0.809201   -0.168658    0.055037    1.871289
foo one  0.286833   -0.988538    0.918153    0.841016
    two  0.348741    0.403747    0.584992   -1.838409
qux one  1.212017   -0.224872    0.616604    1.080590
    two  0.494800   -0.089214    0.829222    2.005217
Run Code Online (Sandbox Code Playgroud)

如何创建一个新列,它是组“一”和“二”在其 #3 列值上的比率(例如第一个元素为 -0.106045 / -0.388760)?

如何将其与当前数据框结合显示?

And*_*den 5

具有不同的随机数。使用变换

In [11]: df.groupby(level=0)[3].transform(lambda x: x[0]/ x[1])
Out[11]:
bar  one   -1.391651
     two   -1.391651
baz  one   -1.688734
     two   -1.688734
foo  one   -1.128344
     two   -1.128344
qux  one   -2.170493
     two   -2.170493
Name: 3, dtype: float64
Run Code Online (Sandbox Code Playgroud)

要显示这一点,请将其设置为一列:

In [12]: df["ratio"] = df.groupby(level=0)[3].transform(lambda x: x[0]/ x[1])
Run Code Online (Sandbox Code Playgroud)