python - 根据特定列中的负值或 np.nan 值将数据帧拆分为块
问题描述
假设我有以下数据框:
import pandas as pd
import numpy as np
df = pd.DataFrame({'dif_seq': [np.nan, 1, 1, 1, 1, -23, 1, 1, 1, -4, 1, 1], 'data': range(12)})
df
Out[75]:
dif_seq data
0 NaN 0
1 1.0 1
2 1.0 2
3 1.0 3
4 1.0 4
5 -23.0 5
6 1.0 6
7 1.0 7
8 1.0 8
9 -4.0 9
10 1.0 10
11 1.0 11
我想根据 df['dif_seq'] 中的值将 df 拆分为数据帧列表,如下所示(所有负值或 np.nan 值表示新 df 的开始):
dif_seq data
0 NaN 0
1 1.0 1
2 1.0 2
3 1.0 3
4 1.0 4
dif_seq data
5 -23.0 5
6 1.0 6
7 1.0 7
8 1.0 8
dif_seq data
9 -4.0 9
10 1.0 10
11 1.0 11
解决此问题的最佳方法是什么?我有一个非常大的数据集的类似问题。所以虽然这是一个小例子,但最快的路线是什么?
解决方案
我想将 df 拆分为数据框列表
您可以尝试使用条件累积和和 np.split:
c = df['dif_seq'].lt(0)|df['dif_seq'].isna()
#c= ~df.dif_seq.ge(0) : courtesy @MustafaAydın
s = c.cumsum()
l = np.split(df,np.where(np.diff(s)>0)[0]+1)
#or for a dictionary: dict(iter(df.groupby(s)))
>>l
[ dif_seq data
0 NaN 0
1 1.0 1
2 1.0 2
3 1.0 3
4 1.0 4,
dif_seq data
5 -23.0 5
6 1.0 6
7 1.0 7
8 1.0 8,
dif_seq data
9 -4.0 9
10 1.0 10
11 1.0 11]
推荐阅读
- google-analytics - GA 动态搜索/替换高级过滤器
- python - 如何在word文档末尾添加新段落?
- javascript - 将数据传递给多个组件或“全局”存储并向 React.js 中的子组件发送“指针”?
- arrays - 查找三元组代码无法调试其抛出的垃圾值
- angular - 在生产模式下构建 Angular App 时,dc 图表看起来不同
- python - 有没有办法置换和/或重复数学运算(* / - +)?(Python)
- python - python中的方法.replace
- linux - 将一行与其以下行进行比较
- python - 如何仅获取此字典中的中间嵌套键?
- javascript - 类型“只读<{}>”上不存在属性“选项”