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

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

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

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

pandas

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

Q&A

解決済

2回答

1574閲覧

2つのデータフレームを比較し、 一方に存在しないインデックスがあった場合、条件分岐するには

castlemist

総合スコア10

Python

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

pandas

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

0グッド

0クリップ

投稿2021/11/27 12:14

お世話になります。
以下の命令を実現したいのですが、方法がわからず困っています。

Pandasの2つのデータフレームを比較し、
一方に存在しないインデックスがあった場合、
条件分岐する。

しかし以下のコードを実行すると、
df_sc["リンク"]とdf_scv["リンク"]に差分がないのにもかかわらず、
elseに進んでしまいます。

python3

1# 以下の2つのデータフレームのカラム名は同じ 2df_sc = pd.DataFrame(dic_data) # スクレイピングしてきたデータ 3df_csv = pd.read_csv("data.csv") # 前回スクレイピングしたデータ 4 5# 差分のインデックスのみ抽出したデータフレームの作成 6df_comp = df_sc[~df_sc["リンク"].isin(df_csv["リンク"])] 7 8# 差分のdf_compをdf_csvと連結 9df_concat = pd.concat([df_csv, df_comp], ignore_index=True, sort=False) 10 11# 連結したデータフレームdf_concatをcsvファイルとして保存 12df_concat.to_csv(path + csv_name, index=False, encoding="utf_8_sig") 13 14# df_csv["リンク"]のカラムにないものがdf_sc["リンク"]にあった場合、通知したい 15for i in df_sc["リンク"]: 16 if i in df_csv["リンク"]: 17 print("既知のリンクです", i) 18 else: 19 print("新しいリンクです", i) 20 notification(i) # 通知の関数 21

原因がわかる方がおられましたら、どうかご教示お願いいたします。
また、より良い書き方があれば、教えてくださいませ。

利用環境
Python 3.9.7
pandas 1.3.3

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

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

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

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

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

kirara0048

2021/11/29 01:52

ここで欲しいデータはdf_compで既に得られているのではないでしょうか。
castlemist

2021/11/29 02:01

ご質問どうもありがとうございます。 タイトルの付け方、あるいは日本語があまり良くなかったかもしれません。 質問の意図は「条件分岐が上手くいかないのですが、どうすればよいでしょうか」といった意味です。
guest

回答2

0

また、より良い書き方があれば、教えてくださいませ。

より良いのかどうかは分かりませんが、set クラスの difference() メソッドを使う方法があります。

python

1diffs = set(df_sc['リンク']).difference(set(df_csv['リンク'])) 2for i in diffs: 3 print("新しいリンクです", i) 4 notification(i) # 通知の関数 5 6for i in set(df_sc['リンク']) - diffs: 7 print("既知のリンクです", i)

投稿2021/11/27 14:28

melian

総合スコア19865

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

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

castlemist

2021/11/28 03:04

ご回答どうもありがとうございます。 set型を初めて知りました。大変勉強になります。 便利そうなので詳しく調べてみます。
guest

0

ベストアンサー

python

1 if i in df_csv["リンク"]:

df_csv["リンク"]はPandas.Seriesなので、期待される動きはしません。
listの変換しましょう。

python

1>>> print(df_sc) 2 リンク 質問 30 https://teratail.com/questions/371263 3 41 https://teratail.com/questions/296243 1 52 https://teratail.com/questions/351872 2 6>>> print(df_csv) 7 リンク 質問 80 https://teratail.com/questions/296243 1 91 https://teratail.com/questions/351872 2 10>>> 11>>> for i in df_sc["リンク"]: 12... if i in list(df_csv["リンク"]): 13... print("既知のリンクです", i) 14... else: 15... print("新しいリンクです", i) 16... 17新しいリンクです https://teratail.com/questions/371263 18既知のリンクです https://teratail.com/questions/296243 19既知のリンクです https://teratail.com/questions/351872

投稿2021/11/27 13:21

ppaul

総合スコア24666

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

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

castlemist

2021/11/28 02:57

どうもありがとうございます。 おかげさまで理想の動きをしてくれるようになりました。 大変助かりました。 しかし、for文ではシリーズがリストのように使えているのに、 if文では使えない理由はなんのでしょうか。
ppaul

2021/11/30 06:18 編集

if文の問題ではなく、in演算子の実装の問題です。 Seriesのinを実装している__contains__については、 >>> df['i'].__contains__.__doc__ 'True if the key is in the info axis' となっていて、それはリストの場合に期待できるものとは違うからです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問