首页 > 解决方案 > Pandas 跨行和列的净值

问题描述

我有一个数据框如下:

Col1    Col2    H1  H2  H3
A       up      19  19  10
A       down        6   11
B       up          13  17
B       down    15  13  11
C       up      13  15  16

我想从上面得到以下信息:

Col1    Col2    H1  H2  H3
A       up      19  13  
A       down            1
B       up              6
B       down    15      
C       up      13  15  16

每种Col1, H1, H2, H3类型的Col2值都已为up和净值down

例如对于

A       up      19  19  10
A       down        6   11

净是

A       up      19  13  
A       down            1

通过19-0, 19-6,获得11-10

行数和列数非常大,所以我尽量不要硬编码它们的值或循环它。有熊猫这样做的方法吗?

标签: pythonpandas

解决方案


如果列中有任何负值,您可以尝试获取每个分组列的差异并反转序列

df.groupby('Col1')['H1','H2','H3'].apply(lambda x:x.diff().fillna(0).transform(lambda x: list(reversed(x.tolist())) if any(x<0) else x) if len(x)>1 else x).abs()

出去:

    H1        H2    H3
0   19.0    13.0     0.0
1   0.0      0.0     1.0
2   0.0      0.0     6.0
3   15.0     0.0     0.0
4   13.0    15.0    16.0

我曾尝试使用没有反转功能的反转熊猫列表,我不知道为什么它不起作用。

df.groupby('Col1')['H1','H2','H3'].apply(lambda x:x.diff().fillna(0).transform(lambda x: x[::-1] if any(x<0) else x) if len(x)>1 else x).abs()

推荐阅读