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

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

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

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

Q&A

解決済

1回答

549閲覧

dataframe形式fileにおいて、ある列に複数回登場する要素のみをとりだして、新しくfileを定義し直したいです。

pickle

総合スコア16

Python

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

0グッド

0クリップ

投稿2020/04/06 01:00

以下の様な"df"というdataframe fileにおいて"ID"という列に複数回登場する要素(ここでは"A","C"が相当)のみをとりだして、新しく"df"を定義したいと考えています(今回だと"ID"が"A" or "C"である、index=0,2,4,5を取り出したいです)。以下の様に記載しましたが、

python

1In: 2df = pd.DataFrame({"ID": ["A", "B","C", "D", "A", "C"], 3 "result":[1,2,3,4,5,6]}) 4 5for i in range(len(df)): 6 if df["ID"].value_counts()["df["ID"][i]"] = 1: 7 df = df.drop(index = i) 8 else: 9 df = df 10 11df.head() 12 13Out: 14File "<ipython-input-40-1b0975bb15fc>", line 5 15 if df["ID"].value_counts()["df["ID"][i]"] = 1: 16 ^ 17SyntaxError: invalid syntax

とerrorがでてしまします。(☆errorがでている箇所の""を削除してみても結果は同じです)

上記の問題点と、もしより簡潔に目的のcodeが書けるようならご教授をお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

ループを使うのであれば、df['ID'].unique() ID列の要素にて行うと良いかと思います。

Python

1for id in df['ID'].unique(): 2 if df["ID"].value_counts()[id] == 1: 3 df = df[df['ID'] != id]

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.unique.html

ループを使わないのであれば、質問のサンプルで使用している value_counts() を利用して

Python

1tmp = df["ID"].value_counts() 2df = df.loc[df['ID'].isin(tmp[tmp > 1].index)]

のように書くこともできますね。

投稿2020/04/06 01:38

magichan

総合スコア15898

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

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

pickle

2020/04/06 04:37

>magichanさん 丁寧にご回答ありがとうございました! loopの方法と、value_counts()の方法ともに理解することができました。 ちなみに、自分が記載したcodeでerrorがでて処理できなかったのはなぜだかわかりますでしょうか? もし分かればお教え頂けますと幸いです。
magichan

2020/04/06 05:03 編集

エラーの原因は if df["ID"].value_counts()["df["ID"][i]"] = 1: の行、 (1) ”df["ID"][i]” の部分で ダブルクォーテーション("") の中で ダブルクォーテーション("") を使用することは出来ません(現在出ているエラーの原因はこれ) "" の中で使うならばシングルクォーテーション('')を使用するべきでしょうね・・・ (2) そもそも外側のダブルクォーテーションはいらない (1)で「"" の中で使うならばシングルクォーテーションを使用するべき(キリッ)」と言っておいてなんですが、そもそも外側のダブルクォーテーションはなんの為についているか不明です。削除で良いのではないでしょうか。 (3) 同じ行の比較演算子にて、Pythonの等値比較演算子は '==' ですので '=' の部分を'=='に修正しましょう。 ということで、この行を if df["ID"].value_counts()[df["ID"][i]] == 1: とするとエラーはなくなると思います。
pickle

2020/04/06 06:08

>magichanさん 早速ご回答ありがとうございます! 本当ですね、正しくできました。 比較演算子についての単純なミスすみませんでした。 またクォテーションについても丁寧に解説頂きありがとうございます。 とてもすっきりしました!今後とも何卒宜しくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問