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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

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

Q&A

解決済

1回答

818閲覧

Pandasのマルチインデックスから条件を指定して行を削除したい

daikou

総合スコア5

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

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

0グッド

0クリップ

投稿2022/06/06 07:19

1 前提・実現したいこと

DataFrameのマルチインデックスは以下のようになっています。

df.head()

イメージ説明

df.tail()

イメージ説明

任意に個人IDが割り当てられ、年齢ageと計測年yearが当てはまります。

headで示した内容はageとyearに矛盾がありません。
しかし、tailで示した結果は同じ個人IDに対して年齢ageと計測年yearが乖離してしまっています

各IDに対して、そのID行が持っているyearが同じになっている時、そのID行を削除する方法を知りたいです。

Pandasの操作に詳しい方が居られましたら、是非とも宜しくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

単純に重複するyearを除去したいだけならdrop_duplicatesでよいかと思いますが

年齢ageと計測年yearが乖離してしまっています

とあるように、両者に何らかの制約条件があるなら、その条件で絞る(さらに重複していたらdrop_する)とよいです。

あるいは、同じyearが複数存在するID(複数)行全体を削除することもできます。

Python

1 2import pandas as pd 3from io import StringIO 4 5s = """ID,age,year 61,10,2012 71,11,2011 82,20,2000 92,22,2000""" 10df = pd.read_csv(StringIO(s), index_col=['ID','age']) 11print(df) 12""" 13 year 14ID age 151 10 2012 16 11 2011 172 20 2000 18 22 2000 19""" 20 21# 単純に重複を除去 22df2 = df.drop_duplicates('year') 23print(df2) 24""" 25 year 26ID age 271 10 2012 28 11 2011 292 20 2000 30""" 31 32# ageとyearに「age+year=2022」なりの何らかの制約条件があるなら 33filter = (df.index.get_level_values(1) + df['year'] == 2022) 34df2 = df[filter] 35print(df2) 36""" 37 year 38ID age 391 10 2012 40 11 2011 412 22 2000 42""" 43 44# yearが重複しているID(複数)行全体を削除したいなら 45df_g1 = (df.groupby(['ID','year']).size() <= 1) # yearが重複していなければTrue 46df_g2 = (df_g1.groupby('ID').sum() >= 1) # yearが重複していないID行ならTrue 47df_g3 = df_g2[df_g2] # 条件に一致するIDを抽出 48filter = (df.index.get_level_values(0).isin( df_g3.index)) # ID値で抽出 49df2 = df[filter] 50print(df2) 51""" 52ID age 531 10 2012 54 11 2011 55"""

投稿2022/06/06 07:44

編集2022/06/06 08:31
can110

総合スコア38352

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

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

daikou

2022/06/06 09:06

大変わかりやすく丁寧にご回答していただきありがとうございました。 本当に助かりました( i _ i )
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問