2
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

データフレーム同士の列の中を比較して、一方にしかないない値を取得する

Last updated at Posted at 2019-09-27

動作環境

python3
jupyter lab

関連リンクです。あなたは、「データフレーム同士のカラム名の差分、比較方法」について探していますか?↓
データフレーム同士のカラム名の差分を取得・比較する方法

#データフレームの任意の1列に対して、ソート&ユニークな要素を取得する
まずは、悪い例。飛ばして読んでもいいです。(失敗は成功の母)

import numpy as np
import pandas as pd

# サンプルとなるデータフレームを作成
df = pd.DataFrame({ 'A' : [1,2,3,4,5], 'B' : ["aaaa","cccc","dddd","bbbb","cccc"]})

#1列だけを取得したあと、ソートに失敗した悪い例
[in]
print(df['B'].sort_index())

[out]
0    aaaa
1    cccc
2    dddd
3    bbbb   ←ソート出来ていない!!
4    cccc
Name: B, dtype: object

#↓このままソートできていないままunique()してしまうザコーダ
[in]
print(df['B'].sort_index().unique())

[out]
['aaaa' 'cccc' 'dddd' 'bbbb']   ←だから、ソート出来てないってば!!

[in]
print("ファッ!?ユニークは出来てるけど、ソートできてないやんけー")

[out]
ファッ!?ユニークは出来てるけど、ソートできてないやんけー

以下、成功例。(追記、全体的に修正しました。コメントありがとうございます。)

#↓ソートの成功例
[in]
print(df['B'].sort_values())

[out]
0    aaaa
3    bbbb      ←ソートできてる
1    cccc
4    cccc
2    dddd
Name: B, dtype: object

#↓sort_valuesすると、pandas.core.series.Series型になってしまう
[in]
print(type(df['B'].sort_values()))

[out]
<class 'pandas.core.series.Series'>

#↓続いて、ソートした上で、ユニークなものだけにする
[in]
print(df['B'].sort_values().unique())

[out]
['aaaa' 'bbbb' 'cccc' 'dddd']


#↓unique()すると、numpy.ndarray型になってしまう
[in]
print(type(df['B'].sort_values().unique()))

[out]
<class 'numpy.ndarray'>

エラーがでるようなときは、type()で型を確認してコーディングしていきます。

【ここからが本題】 データフレーム同士の列の中を比較して、一方にしか存在しない値を確認する

上のやり方を基礎にして、本題を解決します。自分が表示したい内容は、sort_index() と unique()を使って以下のようにして出来ました。

# 比較するためのデータフレームを2つ作る
train = pd.DataFrame({ 'A' : [1,2,3,4,5], 'B' : ["aaaa","cccc","dddd","bbbb","fffff"]})
test  = pd.DataFrame({ 'A' : [1,2,3], 'B' : ["aaaa","dddd","cccc"]})

#↓ソートの正解例
[in]
print(train['B'].sort_values().unique())

[out]
['aaaa' 'bbbb' 'cccc' 'dddd' 'fffff']
               
#これができると、↓このように比較できる
[in]
print(train['B'].sort_values().unique())
print(test['B'].sort_values().unique())

[out]
['aaaa' 'bbbb' 'cccc' 'dddd' 'fffff']
['aaaa' 'cccc' 'dddd']

こうすれば、testデータは、trainデータと比べて、ddddとffffの値が存在しないことがわかりました。データが1000行あったりした場合に、ユニークな値の確認に使えます。
(なんか、もっと良い確認方法ありそうですねー、でも今はこれでいいや)

#あとがき
データの中身を確認する際などは、これで見やすくなると思います。
もっと見やすいやり方あったら、コメントください。

2
6
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?