如何根据列中值的差异拆分 Pandas 数据帧

3
我有一个带有几列的Pandas数据框,其中一列名为“strike”。如果某行的strike列的值大于前一行的strike列的值加上100,则我想在该点将数据框分成两部分(它们仍然具有相同的列名),以此类推。我对Pandas还很陌生,在查找了一些函数后无法找到简单的方法来完成这个操作。
例如:以下数据框:
strike crv vol
1400   w   a 
1450   x   b
1600   y   c
1800   z   d

会得到三个数据框。
strike crv vol
1400   w   a 
1450   x   b

strike crv vol
1600   y   c

strike crv vol
1800   z   d

谢谢!


1
你的意思是类似于 df[(df['strike'] > 100) & (df['strike'].shift() > 100)].index[0] 这样吗? - EdChum
1个回答

12

如果我理解正确,这是比较-累加-分组模式的又一个例子:

>>> 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

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


太棒了,正是我在寻找的。谢谢。 - user3078608
@user3078608:我不想特意提及,但是看起来你似乎从未接受过答案。你是否熟悉这个过程? - DSM
@user3078608: 别担心。看起来还有其他几个在之前的问题中帮助过你的人也需要一些采纳(迟到的采纳总是很好的!) - DSM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接