添付された画像のようなパンダのデータフレームがあります。Wells1,2 、..、nという名前の各列には、異なる生産開始があります。それらのいくつかは5ヶ月目または9ヶ月目で、いくつかは24ヶ月後です。それらすべての開始日を正規化したい。つまり、ゼロ以外のすべての値を上にシフトします。このサンプルコードはWell7でのみうまく機能することは知っていますが、最適化してすべてを一度に実行したいと思います。
df['Well 7'] = df['Well 7'].shift(-1)
私はパンダに不慣れです。ループで試しましたが、データフレーム名がループで機能しません。
df['Well {0}'].format(well)
どんな助けでも大歓迎です!
例Series.str.startswith
ではcols_WellのWell列を検出するために使用します(この手順は省略して、自分で列を選択できます)。
次に、例ではSeries.cumsum
、shift_cols_Wellを使用して0のイニシャルの数を計算できます。したがって、このシリーズは、渡すパラメータを示していますSeries.shift
。
cols_Well = df.columns[df.columns.str.startswith('Well')]
shift_cols_Well = df[cols_Well].ne(0).cumsum().eq(0).sum()
#shift_cols_Well = df[cols_Well].eq(0).cumprod().sum()
for col in cols_Well:
df[col] = df[col].shift(-shift_cols_Well.loc[col])
例
df = pd.DataFrame({'Time':range(1,10),
'Well 1':[0,2,3,4,5,6,7,8,9],'Well 2':[0,0,3,4,5,6,7,8,9]})
Time Well 1 Well 2
0 1 0 0
1 2 2 0
2 3 3 3
3 4 4 4
4 5 5 5
5 6 6 6
6 7 7 7
7 8 8 8
8 9 9 9
ソリューションの例
cols_Well = df.columns[df.columns.str.startswith('Well')]
shift_cols_Well = df[cols_Well].ne(0).cumsum().eq(0).sum()
#shift_cols_Well = df[cols_Well].eq(0).cumprod().sum()
for col in cols_Well:
df[col] = df[col].shift(-shift_cols_Well.loc[col])
print(df)
Time Well 1 Well 2
0 1 2.0 3.0
1 2 3.0 4.0
2 3 4.0 5.0
3 4 5.0 6.0
4 5 6.0 7.0
5 6 7.0 8.0
6 7 8.0 9.0
7 8 9.0 NaN
8 9 NaN NaN
詳細
print(shift_cols_Well)
Well 1 1
Well 2 2
dtype: int64
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加