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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

Q&A

解決済

1回答

836閲覧

コードと日付が変わった場合、フラグを立てたい

YT1967

総合スコア1

Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

0グッド

0クリップ

投稿2021/06/05 02:43

前提・実現したいこと

EDINETコードと会計期間終了日のいずれかが変わった場合、その直前にフラグ1、変わらない場合にその直前にフラグ0を立てたい。

発生している問題・エラーメッセージ

<ソースコード実行結果>
EDINETコード 会計期間終了日
E00004 2016-05-31 0.0
2019-05-31 1.0
E00008 2016-03-31 0.0
2016-03-31 0.0
2020-03-31 1.0
...
E35303 2020-03-31 1.0
E35307 2019-12-31 1.0
E35323 2019-12-31 1.0
E35335 2020-03-31 1.0
E35487 2020-03-31 1.0

該当のソースコード

y_column = 'フラグ'
flag = np.array([np.nan] * len(df), dtype=np.float32)
edinet_codes = df.index.map(lambda x: x[0])
df['会計期間終了日'] = df.index.map(lambda x: x[0])

prev_code = None
prev_date = None

for i, [code, date] in enumerate(zip(edinet_codes, df['会計期間終了日'])):
if (prev_date != date) | (prev_code !=code):
flag[i -1] = 1
prev_date = date
prev_code = code
else:
flag[i -1] =0

df[y_column] = flag
print(df[y_column])

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

can110

2021/06/05 02:54

タグに「python」と「pandas」を加えると、より多くの人の目にとまりやすくなります。 また、質問中の「その直前」というのがよく分からないので、得たい結果の例を示してください。
YT1967

2021/06/05 04:37

teratail初心者なので、アドバイス助かります。 直線の表現分かりにくくすみません。 下記回答いただいた2番目の例が取得したい結果でした。 ありがとうございました。
guest

回答1

0

ベストアンサー

欲しい結果が明確に理解できていませんが、.shiftを使って前後の行との値を比較することで結果が得られるかと思います。

Python

1import pandas as pd 2import numpy as np 3from io import StringIO 4 5s = """code,date 6E1,2021-06-01 7E1,2021-06-01 8E2,2021-06-01 9E2,2021-06-01 10E2,2021-06-02 11E2,2021-06-02 12E3,2021-06-03 13E4,2021-06-04""" 14df = pd.read_csv(StringIO(s), parse_dates=['date']) 15 16# 変化した行が1になる 17# 先頭行は無条件で1になる 18df_prev = df.shift(1) 19ret = (df['code'] != df_prev['code']) | (df['date'] != df_prev['date']) 20df['flag'] = ret.astype(int) 21print(df) 22""" 23 code date flag 240 E1 2021-06-01 1 251 E1 2021-06-01 0 262 E2 2021-06-01 1 273 E2 2021-06-01 0 284 E2 2021-06-02 1 295 E2 2021-06-02 0 306 E3 2021-06-03 1 317 E4 2021-06-04 1 32""" 33 34# 変化する直前の行が1になる 35# 最終行は無条件で1になる 36df_next = df.shift(-1) 37ret = (df['code'] != df_next['code']) | (df['date'] != df_next['date']) 38df['flag'] = ret.astype(int) 39print(df) 40""" 41 code date flag 420 E1 2021-06-01 0 431 E1 2021-06-01 1 442 E2 2021-06-01 0 453 E2 2021-06-01 1 464 E2 2021-06-02 0 475 E2 2021-06-02 1 486 E3 2021-06-03 1 497 E4 2021-06-04 1 50"""

投稿2021/06/05 03:10

can110

総合スコア38341

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

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

YT1967

2021/06/05 04:39

.shiftを使って比較すればよいとのこと、大変勉強になりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問