2 回答
TA贡献1827条经验 获得超7个赞
这有点麻烦,使用diff()、cumsum()和np.size来查找组的大小。使用mask()查找小于 3 的组并将其替换为ffill和bfill
s = df.groupby((df['a'].diff() != 0).cumsum()).transform(np.size)
df['a'] = df[['a']].mask(s < 3).ffill().bfill()
#result
[8., 8., 8., 8., 8., 8., 8., 8., 8., 8., 8., 8., 4., 4., 4., 4., 4.,
4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 5., 5.,
5., 5., 5., 5., 5., 5., 5., 5., 5., 5., 5., 5., 5., 5., 5., 5., 5.,
5., 5.]
TA贡献1853条经验 获得超6个赞
使用NumPy将是有用的:
import numpy as np
import pandas as pd
df = pd.DataFrame({"a" : [8,8,0,8,8,8,8,8,8,8,
4,1,4,4,4,4,4,4,4,4,
4,4,7,7,4,4,4,4,4,4,
4,4,5,5,5,5,5,5,1,1,
5,5,5,5,5,5,1,5,4,5,
5,5,5]})
arr = df.values.reshape(-1)
sub = arr[1:]-arr[:-1]
add2 = sub[1:]+sub[:-1]
add3 = sub[2:]+sub[:-2]
del2 = np.where((sub[1:]!=0) & (add2*sub[1:]==0))[0]+1
del3 = np.where((sub[2:]!=0) & (add3*sub[2:]==0))[0]+1
arr[del2] = arr[del2-1]
arr[del3] = arr[del3-1]
arr[del3+1] = arr[del3+2]
df = pd.DataFrame({"a" : arr})
print(arr)
'''
Output:
[8 8 8 8 8 8 8 8 8 8 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5
5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5]
'''
添加回答
举报