Home About
pandas , Excel , Python

pandas, 特定列のみ抜き出したデータをつくる

支給されたデータのうち特定の列だけを抜き出して使いたい、という場合に pandas を使ったのでその備忘録です。

MacList

こんなエクセルデータがあったとして、これを pandas で処理する。

事前準備

以前に書いたエントリー の通りなので省略。

基本

冒頭のエクセルのファイル ./maclist.xlsx を読み込み:

import pandas as pd
df = pd.read_excel('./maclist.xlsx')
print(df)

python3 main.py などとして実行:

    id     kind         name   price
0  mba   laptop  MacBook Air   98000
1  mbp   laptop  MacBook Pro  248000
2   mm  desktop     Mac mini   78000
3   im  desktop         iMac  154800
4   mp  desktop       MacPro  715000

name, price 列だけを抽出:

df2 = df[['name','price']]
print(df2)

実行結果:

          name   price
0  MacBook Air   98000
1  MacBook Pro  248000
2     Mac mini   78000
3         iMac  154800
4       MacPro  715000

はい、できました。

ただ、これは前回のエントリーでも試したのだが、このコードはどうも腑に落ちない。 ということで、今回は自分が腑に落ちる方法でデータフレームを作り直すコードを書き直す。

import pandas as pd
df = pd.read_excel('./maclist.xlsx')

seriesName = df['name']
nameList = seriesName.values
print(nameList)

実行結果:

['MacBook Air' 'MacBook Pro' 'Mac mini' 'iMac' 'MacPro']

df['name'] することで、name 列のオブジェクトが得られます。これは series オブジェクトになっている。 series.values することで値(のリスト)を得ることができる。

同様に price 列も処理:

serisePrice = df['price']
priceList = serisePrice.values

そして、新規データフレームを作り出す:

rowList = []

for i in range(len(nameList)):
	row = {}
	row['name']  = nameList[i]
	row['price'] = priceList[i]
	rowList.append(row)

df2 = pd.DataFrame(rowList)
print(df2)

これで完全に機能しているが、もう少し簡単にしよう。

pd.DataFrame() するときに 列名と列の値(リスト)を与える方法があった。

df2 = pd.DataFrame( data={'name': nameList, 'price': priceList} )
print(df2)

これなら腑に落ちる範囲でそこまで冗長でないコードになった。

結果としてできたコード:

import pandas as pd
df = pd.read_excel('./maclist.xlsx')

seriseName = df['name']
nameList = seriseName.values

serisePrice = df['price']
priceList = serisePrice.values

df2 = pd.DataFrame( data={'name': nameList, 'price': priceList} )
print(df2)

実行する:

          name   price
0  MacBook Air   98000
1  MacBook Pro  248000
2     Mac mini   78000
3         iMac  154800
4       MacPro  715000

できました。

Liked some of this entry? Buy me a coffee, please.