私はこのようなSeries / DataFrameを持っています。それらに含まれる要素は、1つ以上の値を持つリストです。
0 NaN
1 [40]
2 NaN
3 NaN
4 NaN
5 NaN
6 NaN
7 NaN
8 NaN
9 [35]
10 NaN
11 NaN
12 [28]
13 NaN
14 NaN
15 NaN
16 NaN
17 NaN
Name: tags, dtype: object
不足している値に、5つまでの連続したエントリまでの最新の値を入力したいと思います。制限5の塗りつぶしが最も適切です。ただし、私のユースケースでは、フォワードフィルをオーバーラップさせたい場合があります。私の期待する出力は次のようになります。
0 NaN
1 [40]
2 [40]
3 [40]
4 [40]
5 [40]
6 [40]
7 NaN
8 NaN
9 [35]
10 [35]
11 [35]
12 [28]
13 [35, 28]
14 [35, 28]
15 [28]
16 [28]
17 [28]
Name: tags, dtype: object
上記の例は簡単にするためのものであり、私が説明しているこの関数は、pd.groupby
さらにいくつかのタグを使用したはるかに大きな操作の一部であるため、Pythonループはあまり役に立ちません。タグ自体のインデックスは気にしません。入力されているインデックスだけが重要です。たぶん、パンダのcumsumとインデックスの違いに基づいてスライスするアプローチがここで機能するでしょうか?
この問題に取り組むためのアイデアは、私にとって非常に役立つでしょう。前もって感謝します!
あなたは試すことができます:
# fill na by empty list
df['tags'] = [[] if na else s for s, na in zip(df['tags'], df['tags'].isna())]
# compute rolling windows
df['res'] = [[l for ls in window for l in ls] for window in df['tags'].rolling(5)]
print(df)
出力
tags res
0 [] []
1 [40] [40]
2 [] [40]
3 [] [40]
4 [] [40]
5 [] [40]
6 [] []
7 [] []
8 [] []
9 [35] [35]
10 [] [35]
11 [] [35]
12 [28] [35, 28]
13 [] [35, 28]
14 [] [28]
15 [] [28]
16 [] [28]
17 [] []
別の方法として、chain.from_iterableを使用できます。
from itertools import chain
# compute rolling windows
df['res'] = [list(chain.from_iterable(window)) for window in df['tags'].rolling(5)]
パンダでリストをフラット化するためのいくつかの方法の比較については、この回答を参照してください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加