前回質問の続きのコードになります。
頂いた回答を元に以下の処理まで実装できております。
データ数は7000行*10列の70,000ほどになります。
①各セルの値が0以外の場合+cv_date列の同一行が0で無い場合(日付)が入っているか判定 ②でTrueの場合、各セルの日付からcv_dateまでの日付を引き算で計算し、変数に格納 ③各セルの元々日付の入っていたセルに③の結果の値を更新する
この上記の処理後に各行ごとの数字で最小の値の位置に1を代入し、それ以外を残ったtimestamp型のデータも含めて0にしようとしています。
その中の最小のセルを1にするという処理で.locや.atを使っているのですが、処理が一向に終わらず、PCの方も熱くなっているようで、なんとか高速化できないか方法を探しています。
何か良い方法やメソッドなどがありましたらご教授頂きたいです。
よろしくお願いします。
df = pd.concat((push_start_df,cv_date_df), axis=1) df['cv_date'] = pd.to_datetime(df['cv_date'], errors='coerce') cv = pd.notnull(df['cv_date']) #cv_dateが有効な行 for c in df.columns: if c != 'cv_date': df[c] = pd.to_datetime(df[c], errors='coerce') rows = (cv) & (pd.notnull(df[c])) df2 = df[rows] gap = df2['cv_date'] - df2[c] df.loc[rows,c] = gap.dt.days df3 = df[df.columns[df.columns != 'cv_date']] min_col = df3.idxmin(axis=1) #最小の値のカラムを取得 df.at[rows,min_col] = 1 #各行の最小の値のセルを1に変換
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/07/10 15:12