質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

2393閲覧

データフレームにinsertを使うとnoneが返される(浅いコピー??)

amaturePy

総合スコア131

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2021/07/17 01:15

編集2021/07/17 02:32

データフレームにinsertで列を追加しようとするとNoneが返されます。
調べていくと「浅いコピー」などと言う概念に行き着いたのですが、それを回避できる技術力がなく、自分のコードの中をどのように変更すれば良いかご教授頂きたいです。
十分な説明になっているか不安です。もし不明な箇所などありましたら、追加させて頂きます。よろしくお願いします。

コードの処理内容としては以下になります。
①df変数内のcv_date列と他の列の日付を比較し、一番最近の物をTrue、その他をFalseで返した結果=df2
②pre_df内のcv_date_xの日付データとその他の列の一番日付の中で古い日付と比較し、それより古い場合はTrue、もしくはcv_date_x以外の全ての列がNat場合はTrueを返す=pre_df
③②のpre_dfから生成されたpre_cv列を①のdfにinsertで追加する

df0 = pd.concat((luid,cv_date), axis=1) df = pd.concat((push_start_df,cv_date), axis=1) df['cv_date'] = pd.to_datetime(df['cv_date'], errors='coerce') cv = pd.notnull(df['cv_date']) #cv_dateがTrueな行 luid = df0.loc[cv] luid = luid['luid'] #luidでmergeする際にcv_dateが有効な列だけ取得 query_res2 = pd.merge(luid,query_res2,on=['luid']) is_partial_duplicate = (query_res2['luid'].duplicated(keep="first")) query_res2 = query_res2[~is_partial_duplicate] duplicate_delete = query_res2.filter(like='.', axis=1) query_res2 = query_res2.drop(duplicate_delete, axis=1) #print(query_res2) df = df.loc[cv,:].apply(lambda x:pd.to_datetime(x, errors='coerce')).copy() # cv_dateがTrueな行を抽出すると共に、datetime型にデータを変更したデータフレームを作成 cols=df.columns.drop('cv_date') # cv_date以外の列 pre_df = pd.concat((luid,df), axis=1) pre_df = pd.merge(query_res2,pre_df, on=['luid']) pre_df = pre_df.apply(lambda x: pd.to_datetime(x, errors='coerce')) delete_col = ['cv_date_x','cv_date_y','luid'] pre_cols = pre_df.columns.drop(delete_col) pre_df['pre_cv'] = pre_df.apply(lambda x: True if x['cv_date_x'] < min(x[pre_cols]) or x[pre_cols].isnull().all() else False, axis=1) pre_cv = pre_df['pre_cv'] #print(len(luid)) # cv_dateとの差が一番小さい = その日付が一番大きいということで、 # 日付の最大値と比較した結果とcv_dateを結合してデータフレームを戻している。 df1 = pd.concat([df.loc[:,cols].apply(lambda x: x == np.max(x), axis=1),df['cv_date']], axis=1) df2 = pd.concat((pre_cv,df1), axis=1) df2 = df2.insert(1,'pre_cv', pre_cv) ←ここでpre_cv列をdf2に連結させようとするとNoneが返される
df2 luid,push_a_start_date,push_b_gel_start_date,push_b_start_date,push_c_start_date,push_cp2_start_date,push_cp3_start_date,push_cp_start_date,push_d_start_date,push_e_start_date,push_f_start_date,push_g_start_date,push_h_start_date,cv_date U53a8xxxxxxxxx,False,False,True,False,False,False,False,False,False,False,False,False,2021-07-03 U986c2xxxxxxxx,False,False,False,False,False,False,False,False,False,False,False,False,2021-05-12 pre_cv False True True True True True True True True False

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

insertはそれ自身のデータフレームを更新します。よって
df2 = df2.insert(1,'pre_cv', pre_cv)ではなく
df2.insert(1,'pre_cv', pre_cv)
でよいです。

投稿2021/07/17 02:46

can110

総合スコア38341

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

amaturePy

2021/07/17 04:59

ありがとうございます。実装できました。 自身のデータフレームを更新するのですね、以後気をつけてコードを組んでいきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問