0
1

More than 1 year has passed since last update.

pandasのよく使う書き方

Posted at

はじめに

pythonを使ってデータを分析したり、機械学習を行うときにpandasはよく使うが新しいプロジェクトのたびに使い方を忘れるため備忘録として記録

この記事を書くにあたって一部scikit-learnのワインのデータセットを使用しました。

前準備

main.py
from sklearn.datasets import load_wine
import pandas as pd

wine = load_wine()
df = pd.DataFrame(wine.data, columns=wine.feature_names)

データの概要を確認

info()

データの数やコラム、null値があるかの確認、データのタイプを確認することができる

main.py
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%(第三四分位数)

で表示してくれます。

main.py
df.describe()

出力結果は以下の通り
image.png

また、引数に大文字の'O'を指定する場合、strのようなオブジェクト型のデータを上から、

  • データ数(count)
  • 重複のないデータ数(unique)
  • 最頻出データ(top)
  • 最頻出データの個数(freq)

で表示してくれます。

main.py
df.describe(include=['O'])

が、このデータにはオブジェクトデータがなかったので出力はありませんでした。

また、

main.py
df.describe(include='all')

とすることで、数値データとオブジェクトデータの両方を表示することができます。

head()

Dataframeの頭から5件のデータをそのまま表示することができます。

main.py
df.head()

出力結果は以下の通り
image.png

また、引数に任意の整数を入れることで、その件数分表示することができます。

main.py
df.head(20)

tail()

Dataframeの尻尾から5件のデータをそのまま表示することができます。

main.py
df.tail()

出力結果は以下の通り
image.png

また、引数に任意の整数を入れることで、その件数分表示することができます。

main.py
df.tail(20)

Dataframeの作成

ListからDataframeへの変換

main.py
df_list = ['apple', 'orange', 'banana']
df = pd.DataFrame(df_list)

出力結果は以下の通り

        0
0   apple
1  orange
2  banana

また、行名や列名を指定することも可能

main.py
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次元配列も同様に

main.py
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

逆にしたいなら

main.py
df.T

もしくはlistを分け直して

main.py
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への変換

main.py
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への変換

food.csv
fruit,vegetable
apple,tomato
orange,carrot
banana,lettuce
main.py
df = pd.read_csv('food.csv')

で出力が

    fruit vegetable
0   apple    tomato
1  orange    carrot
2  banana   lettuce

Dataframeの行列の操作

列の抽出

特定の1列の抽出

main.py
df['fruit']

# こっちでも可能
df.fruit

で出力が

0     apple
1    orange
2    banana
Name: fruit, dtype: object

また、for文などで一つづつ取り出すことも可能

main.py
fruit = df['fruit']
for i in fruit:
    print(i)

出力

apple
orange
banana

複数列の抽出

main.py
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

 単一条件の指定

main.py
df[df['money']>150]

出力は

   name  money      sex
1   bob    350     male
2  sara    200   female

複数条件の指定

AND
main.py
df[(df['money']>150) & (df['sex'] == 'male')]

出力は

  name  money   sex
1  bob    350  male
OR
main.py
df[(df['money']>150) | (df['sex'] == 'male')]

出力は

   name  money     sex
0   jon    100    male
1   bob    350    male
2  sara    200  female
NOT
main.py
df[~(df['sex'] == 'male')]

出力は

   name  money     sex
2  sara    200  female

新規行の追加

main.py
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

参考にしたサイト様です。大変ありがとうございます。

0
1
0

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
0
1