Skip to main content
 首页 » 编程设计

python之如何根据列中值的差异拆分 Pandas 数据框

2025年05月04日15jillzhang

我有一个包含几列的 pandas 数据框,其中一列称为“strike”。如果 strike 列的一行的值大于 100 加上 strike 列的前一行,我想在那时将数据框分成两部分(它们仍然具有相同的列名)等等。我是 pandas 的新手,在查找了一些函数后无法想出一个简单的方法来做到这一点。

一个例子:下面的数据框:

strike crv vol 
1400   w   a  
1450   x   b 
1600   y   c 
1800   z   d 

会出现 3 个数据帧:

strike crv vol 
1400   w   a  
1450   x   b 
 
strike crv vol 
1600   y   c 
 
strike crv vol 
1800   z   d 

谢谢!

请您参考如下方法:

IIUC,这是 compare-cumsum-groupby 模式的另一个例子:

>>> df 
   strike crv vol 
0    1400   w   a 
1    1450   x   b 
2    1600   y   c 
3    1800   z   d 
>>> group_ids = (df["strike"] > (df["strike"].shift() + 100)).cumsum() 
>>> grouped = df.groupby(group_ids) 
>>> for k,g in grouped: 
...     print("-----") 
...     print(g) 
...      
----- 
   strike crv vol 
0    1400   w   a 
1    1450   x   b 
----- 
   strike crv vol 
2    1600   y   c 
----- 
   strike crv vol 
3    1800   z   d 

如果您愿意,您可以将其放入列表或字典中:

>>> group_list = [g for k,g in grouped] 
>>> group_list[2] 
   strike crv vol 
3    1800   z   d 
>>> group_dict = dict(list(grouped)) 
>>> group_dict[1] 
   strike crv vol 
2    1600   y   c 

这是可行的,因为我们利用 True == 1 和 False == 0 的事实构建组 ID:

>>> df["strike"] > (df["strike"].shift() + 100) 
0    False 
1    False 
2     True 
3     True 
Name: strike, dtype: bool 
>>> (df["strike"] > (df["strike"].shift() + 100)).cumsum() 
0    0 
1    0 
2    1 
3    2 
Name: strike, dtype: int64 

然后我们可以对这些值进行分组。