使用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 来实现?
将 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
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
由于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 来实现?
将 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
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