動作環境
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行あったりした場合に、ユニークな値の確認に使えます。
(なんか、もっと良い確認方法ありそうですねー、でも今はこれでいいや)
#あとがき
データの中身を確認する際などは、これで見やすくなると思います。
もっと見やすいやり方あったら、コメントください。