提问人:Andrea 提问时间:4/24/2021 更新时间:4/24/2021 访问量:268
根据特定列中的负值或 np.nan 值将数据帧拆分为块
Splitting dataframe into chunks based on negative or np.nan value in specific column
问:
假设我有以下数据帧:
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
最好的方法是什么?我有一个非常大的数据集的分析问题。因此,尽管这是一个小例子,但最快的路线是什么?
答:
4赞
anky
4/24/2021
#1
我想将 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]
评论
3赞
Mustafa Aydın
4/24/2021
太棒了,总能写成?c
~df.dif_seq.ge(0)
1赞
BENY
4/24/2021
#2
使用 和 创建 sub-groupby 键diff
cumsum
s = df['dif_seq'].diff()
s = (s.notnull()& s.ne(0)).cumsum()
s
0 0
1 0
2 0
3 0
4 0
5 1
6 2
7 2
8 2
9 3
10 4
11 4
Name: dif_seq, dtype: int32
d = {x : y for x , y in df.groupby(s)}
1赞
Rob Raymond
4/24/2021
#3
创建一个序列,然后分配一个块,然后将其用作掩码。
df = pd.DataFrame({'dif_seq': [np.nan, 1, 1, 1, 1, -23, 1, 1, 1, -4, 1, 1], 'data': range(12)})
s = (df["dif_seq"].isna() | df["dif_seq"].lt(0)).cumsum()
split = {f"df{i}":df.loc[s.eq(i)] for i in s.unique()}
split
输出
{'df1': dif_seq data
0 NaN 0
1 1.0 1
2 1.0 2
3 1.0 3
4 1.0 4,
'df2': dif_seq data
5 -23.0 5
6 1.0 6
7 1.0 7
8 1.0 8,
'df3': dif_seq data
9 -4.0 9
10 1.0 10
11 1.0 11}
评论