熊猫:计算列

时间:2017-10-10 09:31:01

标签: python pandas

我有数据框

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

1 个答案:

答案 0 :(得分:2)

使用自定义函数每行计算连续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