6
11

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.

Pandas データフレーム同士のカラム名の差分を取得・比較する方法

Last updated at Posted at 2019-09-27

##記事を書いた発端
「dataframe カラム名 比較」とか「データフレーム カラム名 差分」とか検索しても、自分が知りたい情報が出てこなかったので書きました。どんな単語で検索するのが適切なのだろうか・・・。

なお、さきほど似たような内容の投稿をしました。あなたの知りたいことはこちらですか?↓
データフレーム同士の列の中を比較して、一方にしかないない値を取得する

##動作環境
python 3.7.3
jupyterlab 1.0.1

##列が少ないデータフレーム同士の場合
2つのカラム名の一覧をprintで並べて表示するだけですので、検索すればコードはすぐに出てきます。

[in]
import numpy as np
import pandas as pd

# サンプルとなる2つのデータフレームを作成する
train = pd.DataFrame({ 'ID' : [1,2,3], 'Item' : ["aaaa","bbbb","dddd"], 'answer' : [1,1,0]})
test  = pd.DataFrame({ 'ID' : [1,2,3], 'Item' : ["aaaa","bbbb","cccc"]})

# 3列なので、これで十分わかる
print(train.columns)
print(test.columns)

[out]
Index(['ID', 'Item', 'answer'], dtype='object')
Index(['ID', 'Item'], dtype='object')

ワイ「このtrainデータは、testデータと比べて、answerという列が追加されているという違いのみだな、よし」という具合に、簡単にわかるのですが、列が多くなると、このやり方では通用しません。ここからが本題です。

##カラム数が多い場合のカラム名の差分を確認する方法(失敗例)
列がうんざりするほど多いサンプルを以下に作りました(手作業で)。ここでは、a~zの26列くらいのサンプルですが数百列のカラム数とかを想定してください。

[in]
train_data = {
    'aaaa':['1'],'bbbb':['1'],'cccc':['0'],'dddd':['1'],'eeee':['0'],'ffff':['1'],
    'gggg':['1'],'hhhh':['1'],'iiii':['1'],'jjjj':['1'],'kkkk':['0'],'llll':['0'],    
    'mmmm':['0'],'nnnn':['0'],'oooo':['1'],'pppp':['1'],'qqqq':['0'],'rrrr':['1'],
    'ssss':['0'],'tttt':['0'],'uuuu':['0'],'wwww':['1'],'xxxx':['0'],'yyyy':['1'],
    'zzzz':['0']
}
test_data = {
    'aaaa':['1'],'bbbb':['1'],'cccc':['0'],'dddd':['1'],'eeee':['0'],'ffff':['1'],
    'gggg':['1'],'hhhh':['1'],'iiii':['1'],'jjjj':['1'],'kkkk':['0'],'llll':['0'],    
    'mmmm':['0'],'nnnn':['0'],'oooo':['1'],'pppp':['1'],'qqqq':['0'],'rrrr':['1'],
    'ssss':['0'],'tttt':['0'],'uuuu':['0'],'vvvv':['1'],'wwww':['1'],'xxxx':['0'],
    'yyyy':['1']
}
train = pd.DataFrame(train_data)
test  = pd.DataFrame(test_data)
print(train.columns)
print(test.columns)

[out]
Index(['aaaa', 'bbbb', 'cccc', 'dddd', 'eeee', 'ffff', 'gggg', 'hhhh', 'iiii',
       'jjjj', 'kkkk', 'llll', 'mmmm', 'nnnn', 'oooo', 'pppp', 'qqqq', 'rrrr',
       'ssss', 'tttt', 'uuuu', 'wwww', 'xxxx', 'yyyy', 'zzzz'],
      dtype='object')
Index(['aaaa', 'bbbb', 'cccc', 'dddd', 'eeee', 'ffff', 'gggg', 'hhhh', 'iiii',
       'jjjj', 'kkkk', 'llll', 'mmmm', 'nnnn', 'oooo', 'pppp', 'qqqq', 'rrrr',
       'ssss', 'tttt', 'uuuu', 'vvvv', 'wwww', 'xxxx', 'yyyy'],
      dtype='object')

さっきと同様の表示をしましたが、列の数が多くなると、目視で比較することが難しくなります。どうやればよいか、色々検索しましたが、最初に述べた通りいい方法が見つからなくて、時間がかかりました。(カラムの列の中を比較するとかのやり方は出てくるのですが・・・。)
そこで、以下のようにやれば、うまく表示ができます。

カラム数が多い場合のカラム名の差分を確認する方法(これが正解)

[in]
# データフレーム同士のカラム名の差分を取得・比較する方法
# trainにあって、testにないものを表示する
print(list(filter(lambda x: x not in test.columns, train.columns)))
# testにあって、trainにないものを表示する
print(list(filter(lambda x: x not in train.columns,  test.columns)))

[out]
['zzzz']
['vvvv']

どうでしょう。タイトルの目的は果たせました。おつかれ様です。
もっといいやり方あったら、コメントで教えて下さい。

追記)setを使っても、同様に確認出来ます。コメントありがとうございます。

[in]
print((set(train.keys()) - set(test.keys())))
print((set(test.keys())  - set(train.keys())))

[out]
{'zzzz'}
{'vvvv'}
6
11
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
6
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?