我有数据框
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 :(得分: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