はじめに
pythonを使ってデータを分析したり、機械学習を行うときにpandasはよく使うが新しいプロジェクトのたびに使い方を忘れるため備忘録として記録
この記事を書くにあたって一部scikit-learnのワインのデータセットを使用しました。
前準備
from sklearn.datasets import load_wine
import pandas as pd
wine = load_wine()
df = pd.DataFrame(wine.data, columns=wine.feature_names)
データの概要を確認
info()
データの数やコラム、null値があるかの確認、データのタイプを確認することができる
df.info()
出力結果は以下の通り
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 178 entries, 0 to 177
Data columns (total 13 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 alcohol 178 non-null float64
1 malic_acid 178 non-null float64
2 ash 178 non-null float64
3 alcalinity_of_ash 178 non-null float64
4 magnesium 178 non-null float64
5 total_phenols 178 non-null float64
6 flavanoids 178 non-null float64
7 nonflavanoid_phenols 178 non-null float64
8 proanthocyanins 178 non-null float64
9 color_intensity 178 non-null float64
10 hue 178 non-null float64
11 od280/od315_of_diluted_wines 178 non-null float64
12 proline 178 non-null float64
dtypes: float64(13)
memory usage: 18.2 KB
describe()
各コラムの色々な統計量を表示してくれます。引数に何も指定しない場合、数値データの統計量を、上から
- count(データの個数)
- mean(平均値)
- std(標準偏差)
- min(最低値)
- 25%(第一四分位数)
- 50%(中央値)
- 75%(第三四分位数)
で表示してくれます。
df.describe()
また、引数に大文字の'O'を指定する場合、strのようなオブジェクト型のデータを上から、
- データ数(count)
- 重複のないデータ数(unique)
- 最頻出データ(top)
- 最頻出データの個数(freq)
で表示してくれます。
df.describe(include=['O'])
が、このデータにはオブジェクトデータがなかったので出力はありませんでした。
また、
df.describe(include='all')
とすることで、数値データとオブジェクトデータの両方を表示することができます。
head()
Dataframeの頭から5件のデータをそのまま表示することができます。
df.head()
また、引数に任意の整数を入れることで、その件数分表示することができます。
df.head(20)
tail()
Dataframeの尻尾から5件のデータをそのまま表示することができます。
df.tail()
また、引数に任意の整数を入れることで、その件数分表示することができます。
df.tail(20)
Dataframeの作成
ListからDataframeへの変換
df_list = ['apple', 'orange', 'banana']
df = pd.DataFrame(df_list)
出力結果は以下の通り
0
0 apple
1 orange
2 banana
また、行名や列名を指定することも可能
df_list = ['apple', 'orange', 'banana']
df = pd.DataFrame(df_list, index=['id_1', 'id_2', 'id_3'], columns=['fruit'])
出力結果は以下の通り
fruit
id_1 apple
id_2 orange
id_3 banana
2次元配列も同様に
df_list = [['apple', 'orange', 'banana'], ['tomato', 'carrot', 'lettuce']]
df = pd.DataFrame(df_list, index=['id_1', 'id_2'], columns=['column_1','column_2','column_3'])
出力は
column_1 column_2 column_3
id_1 apple orange banana
id_2 carrot tomato lettuce
逆にしたいなら
df.T
もしくはlistを分け直して
df_fruit = ['apple', 'orange', 'banana']
df_vegetable = ['tomato', 'carrot', 'lettuce']
df = pd.DataFrame(list(zip(df_fruit, df_vegetable)), index=['id_1', 'id_2','id_3'], columns=['fruit','vegetable'])
でこの結果が得られる
fruit vegetable
id_1 apple tomato
id_2 orange carrot
id_3 banana lettuce
Dict型からDataframeへの変換
df_dict = {'fruit':['apple', 'orange', 'banana'], 'vegetable': ['tomato', 'carrot', 'lettuce']}
df = pd.DataFrame.from_dict(df_dict)
で出力が
fruit vegetable
0 apple tomato
1 orange carrot
2 banana lettuce
csvファイルからDataframeへの変換
fruit,vegetable
apple,tomato
orange,carrot
banana,lettuce
df = pd.read_csv('food.csv')
で出力が
fruit vegetable
0 apple tomato
1 orange carrot
2 banana lettuce
Dataframeの行列の操作
列の抽出
特定の1列の抽出
df['fruit']
# こっちでも可能
df.fruit
で出力が
0 apple
1 orange
2 banana
Name: fruit, dtype: object
また、for文などで一つづつ取り出すことも可能
fruit = df['fruit']
for i in fruit:
print(i)
出力
apple
orange
banana
複数列の抽出
df.loc[:,['fruit', 'vegetable']]
出力
fruit vegetable
0 apple carrot
1 orange tomato
2 banana lettuce
特定の行、列の抽出
このようなdfを仮定する
name | money | sex |
---|---|---|
jon | 100 | male |
bob | 350 | male |
sara | 200 | female |
単一条件の指定
df[df['money']>150]
出力は
name money sex
1 bob 350 male
2 sara 200 female
複数条件の指定
AND
df[(df['money']>150) & (df['sex'] == 'male')]
出力は
name money sex
1 bob 350 male
OR
df[(df['money']>150) | (df['sex'] == 'male')]
出力は
name money sex
0 jon 100 male
1 bob 350 male
2 sara 200 female
NOT
df[~(df['sex'] == 'male')]
出力は
name money sex
2 sara 200 female
新規行の追加
power = [100,20,500]
df['power'] = power
出力は
name money sex power
0 jon 100 male 100
1 bob 350 male 20
2 sara 200 female 500
まとめ
わからないことがあったらまた増えます。
参考URL
参考にしたサイト様です。大変ありがとうございます。