前提・実現したいこと
Anaconda, Jupyte Notebook環境でPythonの勉強をしています。
現在は読み込んだCSVファイルを元にDataFrameの様々な集計や加工を行っていますが、特定の条件で新たな列を追加する処理に苦戦しています。
元になるDataFrame(df)
ID | 分類 | フラグ |
---|---|---|
1 | A | 前 |
1 | A | 前 |
1 | A | 前 |
1 | A | 前 |
1 | B | 後 |
2 | A | 後 |
2 | A | 前 |
2 | A | 後 |
2 | A | 後 |
2 | B | 後 |
Dataframeに以下のような処理を行いたいと思います。
IDが同じグループの中で、分類がAの行についてフラグを参照し、
-前が3つ以上なら、同じIDのグループ全体にX
-後が3つ以上なら、同じIDのグループ全体にy
-それ以外なら、同じIDのグループ全体にz
として新たな列(新フラグ)追加する。
完成形のイメージとしては
ID | 分類 | フラグ | 新フラグ |
---|---|---|---|
1 | A | 前 | x |
1 | A | 前 | x |
1 | A | 前 | x |
1 | A | 前 | x |
1 | B | 後 | x |
2 | A | 後 | z |
2 | A | 前 | z |
2 | A | 後 | z |
2 | A | 後 | z |
2 | B | 後 | z |
発生している問題・エラーメッセージ
エラーまでたどり着けていません。
該当のソースコード
コードを書く前に、
➀
-前が3つ以上なら、同じIDのグループ全体にX
-後が3つ以上なら、同じIDのグループ全体にy
-それ以外なら、同じIDのグループ全体にz
と判定する関数を作る。➁
「ID」「分類」でグループ化したdfに➀の関数を利用する。(グループごとに処理されることを期待)
という方針を立ててコードを書いてみたものの、よく考えたら「同じIDのグループ全体に結果を返したい」という実現したいことが全く取り込まれていない内容になってしまいました。
一応いま考えているコードを記載します。
Python
1#新フラグに何を入れるか判定する関数 2def decision(row): 3 4 if row['フラグ'].count('前').sum() >= 3 : 5 return 'x' 6 7 elif row['フラグ'].count('後').sum() >= 3 : 8 return 'y' 9 10 else: 11 return 'z' 12 13#dfに新フラグを追加 14df['新フラグ'] = df.groupby(['ID','分類'].agg(decision,axis=1) 15
試したこと
コードを書く以前にどういうロジックで処理を実現すればいいのか?の構想段階で止まってしまっています。
そもそもどのように考えればやりたいことが実現できるのかアドバイスをいただきたいです。(できればコード例もいただけると幸いです)
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/10/08 14:21