Pandas中1个连续块的连接

时间:2017-05-30 14:59:37

标签: python pandas

将二进制序列{0,1}视为Pandas DataFrame: 第一列'a'是原始序列,列'b'是所需的输出。如果间隙(0的连续序列)大于某个常数k(在这种情况下,k = 4),目标是连接1的块。

df
     a  b
180  1  1
181  1  1
182  1  1
183  0  0
184  0  0
185  0  0
186  0  0
187  0  0
188  0  0
189  1  1
190  1  1
191  1  1
192  1  1
193  1  1
194  1  1
195  0  **1**
196  0  **1**
197  0  **1**
198  1  1
199  1  1
200  1  1
201  0  **1**
202  1  1
203  1  1
204  1  1
205  1  1
206  1  1
207  1  1
208  1  1
209  1  1
210  1  1
211  0  **1**
212  0  **1**
213  1  1
214  1  1
215  1  1
216  1  1
217  1  1
218  1  1
219  1  1
220  1  1
221  1  1
222  1  1
223  1  1
224  1  1
225  0  **1**
226  1  1
227  1  1
228  1  1
229  0  **1**
230  1  1
231  1  1
232  1  1
233  1  1
234  1  1
235  1  1
236  0  **1**
237  1  1
238  1  1

我正在研究熊猫和整洁的pandasian解决方案将受到高度赞赏。

1 个答案:

答案 0 :(得分:1)

你可以试试这个:

k=4
df['zeros'] = df.groupby(df.a.cumsum()).cumcount()

df2 = df.assign(b=np.logical_or(df.groupby(df.a.cumsum())['zeros'].transform('max').mask(df.a.astype(bool)).le(k).astype(int),df.a).astype(int)).drop('zeros',axis=1)
print(df2)

输出:

     a  b
180  1  1
181  1  1
182  1  1
183  0  0
184  0  0
185  0  0
186  0  0
187  0  0
188  0  0
189  1  1
190  1  1
191  1  1
192  1  1
193  1  1
194  1  1
195  0  1
196  0  1
197  0  1
198  1  1
199  1  1
200  1  1
201  0  1
202  1  1
203  1  1
204  1  1
205  1  1
206  1  1
207  1  1
208  1  1
209  1  1
210  1  1
211  0  1
212  0  1
213  1  1
214  1  1
215  1  1
216  1  1
217  1  1
218  1  1
219  1  1
220  1  1
221  1  1
222  1  1
223  1  1
224  1  1
225  0  1
226  1  1
227  1  1
228  1  1
229  0  1
230  1  1
231  1  1
232  1  1
233  1  1
234  1  1
235  1  1
236  0  1
237  1  1
238  1  1