整数値のスパースデータフレームがあります。たとえば、次のように作成df
します
df = pd.DataFrame(np.nan, index=range(10), columns=['A', 'B', 'C'])
df.loc[(0,'A')] = 6
df.loc[(3,'A')] = 8
df.loc[(4,'B')] = 2
こんな感じです
A B C
0 6 NaN NaN
1 NaN NaN NaN
2 NaN NaN NaN
3 8 NaN NaN
4 NaN 2 NaN
5 NaN NaN NaN
6 NaN NaN NaN
7 NaN NaN NaN
8 NaN NaN NaN
9 NaN NaN NaN
ここで、各nan値に前の値-1を再帰的に入力します(nanでない場合)。たとえば、このコードはトリックを実行します。
for j in range(len(df.index)):
df = df.fillna(value=df.shift(1)-1, limit=1)
そしてそれは生成します
A B C
0 6 NaN NaN
1 5 NaN NaN
2 4 NaN NaN
3 8 NaN NaN
4 7 2 NaN
5 6 1 NaN
6 5 0 NaN
7 4 -1 NaN
8 3 -2 NaN
9 2 -3 NaN
問題は、「実際の」データフレームに適用されるこのコードは、範囲に制限がある場合でも、地獄のように遅いことですj
。非常にdf.fillna(method='ffill')
高速な単純なものに非常に近いように見えるので、このプロセスを高速化する方法があるかどうか疑問に思いました。
回答、洞察、コメントを事前に感謝します。
これは一般的な解決策ではありませんが、特定の場合に期待される出力を生成するはずです。
for col in df.columns:
g = df[col].notnull().cumsum()
df[col] = df[col].fillna(method='ffill') - df[col].groupby(g).cumcount()
基本的に、前方に入力してから、最後のnull以外の値の後に連続するnanの数を減算します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加