使用groupby分割熊猫中的多维数据

时间:2019-09-11 13:12:35

标签: python pandas pandas-groupby division

由于熊猫无法在多维中工作,因此我通常按行堆叠数据,并使用虚拟列标记数据尺寸。现在,我需要将一个维度除以另一个维度。

例如,给定此数据框,其中键定义了尺寸

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的方法?

2 个答案:

答案 0 :(得分:2)

您实际上并不需要(也不应使用)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

答案 1 :(得分:1)

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返回的结果,是我们每个a,b对的唯一标识符:

print(s)

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