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

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

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

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

pandas

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

Q&A

解決済

2回答

3481閲覧

Pandasで重複指定した行で条件付けした行を削除したい。

kenone

総合スコア32

Python

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

pandas

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

0グッド

0クリップ

投稿2020/09/07 14:32

前提・実現したいこと

Pandasで指定した行を削除したいです。

No商品現在種類更新種類
1みかんAB
2みかんBC
3ぶどうBA
4すいかCC

これを

No商品現在種類更新種類
2みかんBC
3ぶどうBA
4すいかCC

したいです。

言葉で説明するのが難しいですが
削除条件は商品名が同じで、更新種類と現在種類が存在する場合は、更新種類のデータを削除する。
例で言うと
データNo1,2みかんのデータで、
No2の現在種類:Bがあるので、No1の更新種類の行を削除する。

テストデータ

txt = """ No,商品,現在種類,更新種類 1,みかん,A,B 2,みかん,B ,C 3,りんご,B,A 4,すいか,C,C """ import io import pandas as pd df = pd.read_table(io.StringIO(txt), sep=",",index_col=0)

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

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

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

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

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

meg_

2020/09/07 14:43

> データNo1,2みかんのデータで、 > No2の現在種類:Bがあるので、No1の更新種類の行を削除する。 もう少し説明してもらえませんか?
kenone

2020/09/07 16:06

わかりづらくすいません。 データで言うと 商品:みかん(No1,No2)重複の中で、更新種類:Bが、現在種類に存在していれば その行を削除としたいのです。 伝わりましたでしょうか?
meg_

2020/09/07 16:47

やっと分かりました。 方法としてはgroupbyしてその中でループ処理でしょうか。
kenone

2020/09/07 23:07

回答ありがとうございます。 groupbyを確認したところグループ化するだけなので 結局はループで1つ1つ判断する方法しか無いということですね。。。
guest

回答2

0

python

1import pandas as pd 2 3df = pd.DataFrame({'No':[1,2,3,4],'商品':['みかん','みかん','ぶどう','すいか'],'現在種類':['A','B','B','C'],'更新種類':['B','C','A','C']}) 4print(df) 5# No 商品 現在種類 更新種類 6#0 1 みかん A B 7#1 2 みかん B C 8#2 3 ぶどう B A 9#3 4 すいか C C 10 11df = df.merge(df.groupby('商品')['更新種類'].apply(list).apply(lambda x: ''.join(x)), on='商品') 12df['tmp'] = df['更新種類_y'] + df['現在種類'] 13df['tmp'] = df['tmp'].apply(lambda x: ''.join(set(x))) 14df['count'] = df.groupby('商品')['No'].transform('count') 15df = df[~(~(df['tmp'] == df['更新種類_y']) & (df['count'] > 1))] 16df = df.drop(['更新種類_y','tmp','count'], axis=1) 17df = df.rename(columns={'更新種類_x':'更新種類'}) 18print(df) 19#No 商品 現在種類 更新種類 20#1 2 みかん B C 21#2 3 ぶどう B A 22#3 4 すいか C C

投稿2020/09/08 13:15

meg_

総合スコア10580

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

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

kenone

2020/09/09 00:57

ありがとうございます。 すごいですね。 pandasでここまでできることがわかりました。
meg_

2020/09/09 04:12

データ数が多い場合はループしない方が早いです。
guest

0

ベストアンサー

Python

1import pandas as pd 2import io 3 4txt = """ 5No,商品,現在種類,更新種類 61,みかん,A,B 72,みかん,B,C 83,りんご,B,A 94,すいか,C,C 10""" 11 12txt2 = """ 13No,商品,現在種類,更新種類 141,みかん,A,B 152,みかん,B,C 163,みかん,C,D 174,りんご,A,Z 185,りんご,B,A 196,すいか,C,C 207,すいか,C,D 21""" 22 23df = pd.read_table(io.StringIO(txt), sep=",", index_col=0) 24# print(df) 25 26dfn = df.copy() 27for _, group in df.groupby('商品'): 28 if len(group) <= 1: 29 continue 30 current = group.現在種類.tolist() 31 for row in group.itertuples(): 32 if row.更新種類 in current: 33 dfn = dfn.drop(row.Index, axis=0) 34print(dfn)

txtに対しては、

result

1 商品 現在種類 更新種類 2No 32 みかん B C 43 りんご B A 54 すいか C C

txt2に対しては、

result

1 商品 現在種類 更新種類 2No 33 みかん C D 44 りんご A Z 57 すいか C D

投稿2020/09/08 00:53

Daregada

総合スコア11990

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

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

kenone

2020/09/09 00:48

早い回答ありがとうございました。 シンプルで良いですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問