使用groupby对pandas中的多维数据进行划分

Division of multiple dimension data in pandas using groupby

由于pandas无法在多维度上工作,我通常按行堆叠数据并使用虚拟列来标记数据维度。现在,我需要将一个维度除以另一个维度。

例如,给定此数据框,其中键定义维度

index  key  value
0       a   10
1       b   12
2       a   20
3       b   15
4       a   8
5       b   9

我想实现这个:

index   key value   ratio_a_b    
0      a    10     0.833333    
1      b    12     NaN
2      a    20     1.33333
3      b    15     NaN
4      a    8      0.888889
5      b    9      NaN

有没有办法使用 groupby 来实现?

eqcumsumGroupBy.applyshift 结合使用。

我们使用 .eq 获取值为 a 的布尔值,然后我们使用 cumsum 为每个 a, b 对创建一个唯一标识符。

然后我们使用 groupbydivide 每个值按下面一行的值 shift

s = df['key'].eq('a').cumsum()

df['ratio_a_b'] = df.groupby(s)['value'].apply(lambda x: x.div(x.shift(-1)))

输出

  key  value  ratio_a_b
0   a     10   0.833333
1   b     12        NaN
2   a     20   1.333333
3   b     15        NaN
4   a      8   0.888889
5   b      9        NaN

这就是 s returns,我们每个 a,b 对的唯一标识符:

print(s)

0    1
1    1
2    2
3    2
4    3
5    3
Name: key, dtype: int32

你真的不需要(也不应该使用)groupby

# interpolate the b values
s = df['value'].where(df['key'].eq('b')).bfill()

# mask the a values and divide
# change to df['key'].ne('b') if you have many values of a
df['ratio'] = df['value'].where(df['key'].eq('a')).div(s)

输出:

   index key  value     ratio
0      0   a     10  0.833333
1      1   b     12       NaN
2      2   a     20  1.333333
3      3   b     15       NaN
4      4   a      8  0.888889
5      5   b      9       NaN