3 回答

TA貢獻1856條經驗 獲得超17個贊
如果你想要速度,避免使用 groupby 并使用 numpy 而不是 pandas 是可以遵循的好規(guī)則。這通常是不可能的,但在這里你有非常規(guī)則的數據的特殊情況,你所需要的只是形式的下標三元組[start:end:stride]:
df.iloc[0::4,1] = df.iloc[1::4,1].values
df.iloc[3::4,1] = df.iloc[2::4,1].values
說明:大多數人都知道您可以使用 form 的下標,[start:stop]但您也可以添加一個可選stride參數。所以第一行說用元素 1,5,9,... 替換元素 0,4,8,... “值”是刪除 pandas 索引所必需的,這實際上在這里是有害的。
通過避免 groupby,這應該會更快一些。為了提高速度,您可以將 B 列輸出到 numpy,在 numpy 中工作(基本上是相同的代碼),然后重新導入到 pandas:
arr = df.B.values
arr[0::4] = arr[1::4]
arr[3::4] = arr[2::4]
df.B = arr
如果您想留在 pandas 中,您可以做的另一件事是取消堆疊,復制整個列,然后重新堆疊。無論如何,這基本上就是上面的代碼所做的。老實說,對于這種矩形類型的問題,任何數組樣式的方法都會相當快。

TA貢獻1818條經驗 獲得超7個贊
如果您的數據確實具有連續(xù)組的良好結構,那么您可以groupby通過使用limit參數 inffill和bfilllike 來避免:
print (df['B'].ffill(limit=1).bfill(limit=1))
0 f1
1 f1
2 b1
3 b1
4 f2
5 f2
6 b2
7 b2
Name: B, dtype: object

TA貢獻1784條經驗 獲得超2個贊
如果你的格式是前綴 as (Nan, x, y, Nan),什么時候可以做
df.B=df.groupby([df.A,df.index//2]).B.transform('first')
Out[169]:
B
0 f1
1 f1
2 b1
3 b1
4 f2
5 f2
6 b2
7 b2
添加回答
舉報