由于熊猫无法在多维中工作,因此我通常按行堆叠数据,并使用虚拟列标记数据尺寸。现在,我需要将一个维度除以另一个维度。
例如,给定此数据框,其中键定义了尺寸
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的方法?
答案 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)
将eq
,cumsum
和GroupBy.apply
与shift
一起使用。
我们使用.eq
来获取一个布尔值,其中的值为a
,然后我们使用cumsum
为每个a, b
对创建唯一的标识符。
然后,我们将groupby
和divide
的每个值与下面的值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