解释我想要完成的事情的最好方法可能就是一个例子。给出以下dataFrame:
tag ID
0 0 1
1 0 2
2 1 3
3 1 4
4 0 5
5 1 6
6 0 7
7 0 8
8 1 9
9 1 10
10 0 11
11 0 12
12 0 13
13 1 14
14 1 15
15 1 16
16 0 17
根据标记,将dataFrame划分为' chunk'。识别块时,它存储在单独的dataFrame(或者dataFrames列表?)中。 '分块的标准'将在标签列中查找2个或更多零。如果有超过2个零,则跳出 以前的零之间存在的所有数据,以及当前的零。
在上面的示例dataFrame中,代码将摆脱索引的行:0,1,6,7,10,11,12 ...然后它会将以下块存储到单独的dataFrame中:
tag ID
2 1 3
3 1 4
4 0 5
5 1 6
tag ID
8 1 9
9 1 10
tag ID
13 1 14
14 1 15
15 1 16
16 0 17
我希望它清楚。如果没有道歉...... 有没有一个好的pythonic方法来实现这一点,而不会产生大量的循环?
感谢您的帮助, CJ
答案 0 :(得分:2)
已经尽力了...我正在使用另外两个新参数
df['group']=df.tag.diff().fillna(0).ne(0).cumsum()
df1=df.groupby('group').tag.agg([sum,lambda x : len(x)])
dropindex=df1[(df1['sum']==0)&(df1['<lambda>']>1)].index # only drop more than one continue 0
df=df.loc[~df.group.isin(dropindex)]
df['group2']=df.reset_index()['index'].diff().ne(1).cumsum().values
for _, dfyourneed in df.groupby('group2',as_index=False):
print(dfyourneed.drop(['group2','group'],1))
tag ID
2 1 3
3 1 4
4 0 5
5 1 6
tag ID
8 1 9
9 1 10
tag ID
13 1 14
14 1 15
15 1 16
16 0 17
或者您可以将其保存到列表中
[dfyourneed.drop(['group2', 'group'], 1) for _, dfyourneed in df.groupby('group2', as_index=False)]
Out[1083]:
[ tag ID
2 1 3
3 1 4
4 0 5
5 1 6, tag ID
8 1 9
9 1 10, tag ID
13 1 14
14 1 15
15 1 16
16 0 17]
答案 1 :(得分:1)
这是我试过的, 通过排除具有两个或更多零的行来创建df_new。
df_new = df[(df.tag + df.tag.shift() != 0) & (df.tag + df.tag.shift(-1) != 0)]
创建df_new索引的numpy数组,并根据连续值
对其进行拆分a = np.array(df_new.index.tolist())
l = np.split(a, np.where(np.diff(a) != 1)[0]+1)
使用index
上的列表推导创建df列表df_list = [df.iloc[i] for i in l]
要访问数据框,请使用
df_list[0]
tag ID
2 1 3
3 1 4
4 0 5
5 1 6