如果我有一个Pandas 数据框,有以下几列:id,num,amount.

我希望对数据帧进行分组,以便每组中的所有行都具有相同的idamount,并且其中每行的值num的值不超过下一行的值num的值.

对于相同的id,如果一行到下一行不具有相同的amount,或者如果两个num值之间的绝对差值大于10,则它将开始新的分组.中间有不同的id的行不会 destruct 分组.

我该如何着手做这件事呢?

我没有在不寻找匹配值的地方进行分组(就像这里我需要它接近的地方--但不匹配).我想这将需要一些定制的分组功能,但我一直难以将其组合在一起

Example dataframe:

id amount num
aaa-aaa 130 12
aaa-aaa 130 39
bbb-bbb 270 41
ccc-ccc 130 19
bbb-bbb 270 37
aaa-aaa 130 42
aaa-aaa 380 39

Expected Groups:

第一组:

id amount num
aaa-aaa 130 12

第二组:

id amount num
aaa-aaa 130 39
aaa-aaa 130 42

第三组:

id amount num
bbb-bbb 270 41
bbb-bbb 270 37

第四组:

id amount num
ccc-ccc 130 19

第五组:

id amount num
aaa-aaa 380 39

推荐答案

逻辑并不完全清楚,但假设你想要在差距超过10%的情况下开始一个新的小组:

close = (df.sort_values(by=['amount', 'num'])
           .groupby('amount')
           ['num'].diff().abs().gt(10).cumsum()
         )

for _, g in df.groupby(['amount', close]):
    print(g, end='\n\n')

输出:

        id  amount  num
0  aaa-aaa     130   12
3  ddd-ddd     130   19

        id  amount  num
1  bbb-bbb     130   39

        id  amount  num
2  ccc-ccc     270   41
4  eee-eee     270   37
how it works:
# sort values by amount/sum
df.sort_values(by=['amount', 'num'])

        id  amount  num
0  aaa-aaa     130   12
3  ccc-ccc     130   19
1  aaa-aaa     130   39
5  aaa-aaa     130   42
4  bbb-bbb     270   37
2  bbb-bbb     270   41
6  aaa-aaa     380   39

# get the absolute successive difference in "num"
(df.sort_values(by=['amount', 'num'])
   .groupby('amount')
   ['num'].diff().abs()
)

0     NaN
3     7.0
1    20.0
5     3.0
4     NaN
2     4.0
6     NaN
Name: num, dtype: float64

# check if it's greater than 10 and cumsum
# to create a grouper for groupby

[...].gt(10).cumsum()

0    0
3    0
1    1
5    1
4    1
2    1
6    1
Name: num, dtype: int64

Python相关问答推荐

如何使用symy打印方程?

Python上的Instagram API:缺少client_id参数"

如何使用根据其他值相似的列从列表中获取的中间值填充空NaN数据

Julia CSV for Python中的等效性Pandas index_col参数

如何在Python脚本中附加一个Google tab(已经打开)

ODE集成中如何终止solve_ivp的无限运行

当独立的网络调用不应该互相阻塞时,'

为什么NumPy的向量化计算在将向量存储为类属性时较慢?'

为一个组的每个子组绘制,

Python脚本使用蓝牙运行在Windows 11与raspberry pi4

Pandas GroupBy可以分成两个盒子吗?

在www.example.com中使用`package_data`包含不包含__init__. py的非Python文件

导入错误:无法导入名称';操作';

替换现有列名中的字符,而不创建新列

有没有一种方法可以在朗肯代理中集成向量嵌入

为什么我的scipy.optimize.minimize(method=";newton-cg";)函数停留在局部最大值上?

使用美汤对维基百科表格进行网络刮擦未返回任何内容

根据边界点的属性将图划分为子图

如何在networkx图中提取和绘制直接邻居(以及邻居的邻居)?

PyTorch变压器编码器中的填充掩码问题