我有数据框

ID  2016-01   2016-02   2016-03   2016-04   2016-05  2016-06  2016-07  2016-08   2016-09   2016-10   2016-11   2016-12
111   1          1         0         0         0       1         1        0         1          0         0         1
222   0          1         12        0         0       0         1        1         0          0         0         1


我需要在每6列中计数0附近,并获得最大序列的最大长度。

我将元素分组,但我不知道如何计算附近的元素

print(pd.concat([df['ID'], df.drop('ID', 1).groupby((np.arange(len(df.drop('ID', 1).columns)) // 31) + 1,
                                                   axis=1).add_prefix('s')], axis=1))


我的意思是

ID   2016-01   -   2016-06            2016-07   -   2016-12
111       [3]                                 [1, 2]
222       [1, 3]                              [3]


和欲望输出

ID    s1   s2
111   3    2
222   3    3

最佳答案

使用自定义函数对每行连续的0进行计数,然后返回max值:

def f(x):
    a = x == 0
    b = a.cumsum(axis=1)
    c = b-b.where(~a, axis=1).ffill(axis=1).fillna(0).astype(int)
    return (c.max(axis=1))

arr = (np.arange(len(df.drop('ID', 1).columns)) // 6) + 1
df = df.set_index('ID').groupby(arr, axis=1).apply(f).add_prefix('s').reset_index()
print (df)
    ID  s1  s2
0  111   3   2
1  222   3   3


详细信息(函数不返回最大值,但返回所有数据):

def f(x):

    a = x == 0
    b = a.cumsum(axis=1)
    c = b-b.where(~a, axis=1).ffill(axis=1).fillna(0).astype(int)
    return (c)


arr = (np.arange(len(df.drop('ID', 1).columns)) // 6) + 1
df = df.set_index('ID').groupby(arr, axis=1).apply(f).add_prefix('s').reset_index()
print (df)
    ID  s2016-01  s2016-02  s2016-03  s2016-04  s2016-05  s2016-06  s2016-07  \
0  111         0         0         1         2         3         0         0
1  222         1         0         0         1         2         3         0

   s2016-08  s2016-09  s2016-10  s2016-11  s2016-12
0         1         0         1         2         0
1         0         1         2         3         0

关于python - Pandas :在栏中计算附近的一些元素,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46663295/

10-11 19:40