将大熊猫数据框划分为' chunks'基于列值

时间:2017-10-10 22:37:18

标签: python pandas

解释我想要完成的事情的最好方法可能就是一个例子。给出以下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

2 个答案:

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