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

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

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

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

pandas

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

Q&A

解決済

1回答

1451閲覧

DataFrameの任意の位置に代入した値が更新されない。

amaturePy

総合スコア131

Python 3.x

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

pandas

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

0グッド

0クリップ

投稿2021/07/09 07:37

編集2021/07/09 07:45

以下の処理を実装したく、コードを作成しているのですが、処理結果を既存のDataFrameに更新する所でつまづいてます。
①For文で各セルの値を取得
②各セルの値が0以外の場合+cv_date列の同一行が0で無い場合(日付)が入っているか判定
③②でTrueの場合、各セルの日付からcv_dateまでの日付を引き算で計算し、その結果をgap_time変数に格納
④各セルの元々日付の入っていたセルに③の結果の値を更新する

現在上記の④でつまづいています。
上記①〜④の処理後のdf1の中身を見ると処理以前と中身の値に変化がなく。うまく更新されていないようです。
DataFrameの値の更新に関して間違っている所などありましたらご教授頂きたいです。
よろしくお願いします。
本来は処理しているdf1[j][i]の中身がIf文内の処理結果のgap_timeの値に更新されるのが理想です。

データ更新部分の試したコード ①df1.iloc[i][j] = gap_time.days →変化なし。 ②df1[j][i] = gap_time.days →A value is trying to be set on a copy of a slice from a DataFrameと警告が出るものの変化なし。 ③df1.at[i,j] = gap_time.days →変化なし。
df1 push_a_start_date push_b_gel_start_date push_b_start_date push_c_start_date ... push_f_start_date push_g_start_date push_h_start_date cv_date 0 0 0 0 0 ... 0 0 0 0 1 0 0 0 0 ... 0 0 0 2021-03-30 2 2021-07-05 0 2021-07-06 0 ... 0 0 0 0 3 0 0 0 0 ... 0 0 0 2021-05-04 4 2021-06-30 0 0 0 ... 0 0 0 0
print(gap_time)結果 -262 -1 0 10 0 -13 0 -1
test.py df1 = pd.concat((push_start_df,cv_df), axis=1) df1 = df1.fillna(0) #push_start_df = push_start_df.fillna(0) res_list = [] for i in range(len(df1.index)): for j in df1.columns: if j != 'cv_date': if df1[j][i] != 0 and df1['cv_date'][i] != 0: datetime1 = datetime.strptime(df1['cv_date'][i], "%Y-%m-%d") datetime2 = datetime.strptime(df1[j][i], "%Y-%m-%d") gap_time = (datetime1 - datetime2) #print(gap_time.days) df1.at[i,j] = gap_time.days ← 更新処理

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

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

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

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

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

guest

回答1

0

ベストアンサー

以下のように処理対象列をdatetime型に変換してやると一括操作できるので簡単かと思います。
なお、fllnaは最初ではなく最後に行います。

Python

1import pandas as pd 2from io import StringIO 3from datetime import datetime 4 5# テストデータ 6s = """a_date,b_date,cv_date 72021-07-01,2021-07-02,2021-07-10 8,,2021-07-11 92021-07-02,,2021-07-11 10,2021-07-03,2021-07-12""" 11df = pd.read_csv(StringIO(s)) 12 13df['cv_date'] = pd.to_datetime(df['cv_date'], errors='coerce') 14cv = pd.notnull(df['cv_date']) # cv_dateが有効な行 15 16for c in df.columns: 17 if c != 'cv_date': 18 df[c] = pd.to_datetime(df[c], errors='coerce') 19 rows = (cv) & (pd.notnull(df[c])) # どちらも有効な行 20 df2 = df[rows] 21 gap = df2['cv_date'] - df2[c] 22 df.loc[rows,c] = gap.dt.days 23 24df = df.fillna(0) 25print(df) 26# a_date b_date cv_date 27#0 9 8 2021-07-10 28#1 0 0 2021-07-11 29#2 9 0 2021-07-11 30#3 0 9 2021-07-12

投稿2021/07/09 08:28

can110

総合スコア38341

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

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

amaturePy

2021/07/09 14:34

ありがとうございます!実装できました。 こんなに簡潔に書けるんですね。。。データフレームの学習先が長そうですが、とても感動しました。 頂いたコードを参考に今後も学習して行きます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問