pandasとデータ分析
pandasはデータ分析では必ず利用する重要なツールです。この使い方を知るか知らないか、もしくは、やりたいことをグーグル検索しなくてもすぐに手を動かせるかどうかは、エンジニアとしての力量に直結します。ここでは、具体的なデータを元に私の経験から重要と思われるメソッドや使い方を説明します。他に重要な使い方に遭遇したらどんどん追記していきます。
github
- jupyter notebook形式のファイルはこちら
google colaboratory
- google colaboratory で実行する場合はこちら
筆者の環境
筆者のOSはmacOSです。LinuxやUnixのコマンドとはオプションが異なります。
!sw_vers
ProductName: Mac OS X
ProductVersion: 10.14.6
BuildVersion: 18G6020
!python -V
Python 3.7.3
基本的なライブラリをインポートしそのバージョンを確認しておきます。
%matplotlib inline
%config InlineBackend.figure_format = 'svg'
import matplotlib
import matplotlib.pyplot as plt
import scipy
import numpy as np
print('matplotlib version :', matplotlib.__version__)
print('scipy version :', scipy.__version__)
print('numpy version :', np.__version__)
matplotlib version : 3.0.3
scipy version : 1.4.1
numpy version : 1.16.2
importとバージョン確認
import pandas as pd
print('pandas version :', pd.__version__)
pandas version : 1.0.3
基本操作
データの読み込みと表示
利用させてもらうデータはdanielさんのgithub になります。pandasの使い方の本を書いておられる有名な方のリポジトリです。Pythonデータ分析/機械学習のための基本コーディング! pandasライブラリ活用入門 です。僕も持っています。とても勉強になると思います。
データはエボラ出血の発生数(Case)と死者数(Death)だと思います。
read_csv
を利用して、CSVを読み込み、先頭の5行目を表示してみます。
import pandas as pd
df = pd.read_csv('./country_timeseries.csv', sep=',')
df.head()
Date | Day | Cases_Guinea | Cases_Liberia | Cases_SierraLeone | Cases_Nigeria | Cases_Senegal | Cases_UnitedStates | Cases_Spain | Cases_Mali | Deaths_Guinea | Deaths_Liberia | Deaths_SierraLeone | Deaths_Nigeria | Deaths_Senegal | Deaths_UnitedStates | Deaths_Spain | Deaths_Mali | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1/5/2015 | 289 | 2776.0 | NaN | 10030.0 | NaN | NaN | NaN | NaN | NaN | 1786.0 | NaN | 2977.0 | NaN | NaN | NaN | NaN | NaN |
1 | 1/4/2015 | 288 | 2775.0 | NaN | 9780.0 | NaN | NaN | NaN | NaN | NaN | 1781.0 | NaN | 2943.0 | NaN | NaN | NaN | NaN | NaN |
2 | 1/3/2015 | 287 | 2769.0 | 8166.0 | 9722.0 | NaN | NaN | NaN | NaN | NaN | 1767.0 | 3496.0 | 2915.0 | NaN | NaN | NaN | NaN | NaN |
3 | 1/2/2015 | 286 | NaN | 8157.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 3496.0 | NaN | NaN | NaN | NaN | NaN | NaN |
4 | 12/31/2014 | 284 | 2730.0 | 8115.0 | 9633.0 | NaN | NaN | NaN | NaN | NaN | 1739.0 | 3471.0 | 2827.0 | NaN | NaN | NaN | NaN | NaN |
末尾の5データを表示します。
df.tail()
Date | Day | Cases_Guinea | Cases_Liberia | Cases_SierraLeone | Cases_Nigeria | Cases_Senegal | Cases_UnitedStates | Cases_Spain | Cases_Mali | Deaths_Guinea | Deaths_Liberia | Deaths_SierraLeone | Deaths_Nigeria | Deaths_Senegal | Deaths_UnitedStates | Deaths_Spain | Deaths_Mali | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
117 | 3/27/2014 | 5 | 103.0 | 8.0 | 6.0 | NaN | NaN | NaN | NaN | NaN | 66.0 | 6.0 | 5.0 | NaN | NaN | NaN | NaN | NaN |
118 | 3/26/2014 | 4 | 86.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 62.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
119 | 3/25/2014 | 3 | 86.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 60.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
120 | 3/24/2014 | 2 | 86.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 59.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
121 | 3/22/2014 | 0 | 49.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 29.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
データの確認
データの型などの情報を取得
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 122 entries, 0 to 121
Data columns (total 18 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Date 122 non-null object
1 Day 122 non-null int64
2 Cases_Guinea 93 non-null float64
3 Cases_Liberia 83 non-null float64
4 Cases_SierraLeone 87 non-null float64
5 Cases_Nigeria 38 non-null float64
6 Cases_Senegal 25 non-null float64
7 Cases_UnitedStates 18 non-null float64
8 Cases_Spain 16 non-null float64
9 Cases_Mali 12 non-null float64
10 Deaths_Guinea 92 non-null float64
11 Deaths_Liberia 81 non-null float64
12 Deaths_SierraLeone 87 non-null float64
13 Deaths_Nigeria 38 non-null float64
14 Deaths_Senegal 22 non-null float64
15 Deaths_UnitedStates 18 non-null float64
16 Deaths_Spain 16 non-null float64
17 Deaths_Mali 12 non-null float64
dtypes: float64(16), int64(1), object(1)
memory usage: 17.3+ KB
大きさ(行数と列数)の確認
df.shape
(122, 18)
インデックスの確認
df.index
RangeIndex(start=0, stop=122, step=1)
カラム名の確認
df.columns
Index(['Date', 'Day', 'Cases_Guinea', 'Cases_Liberia', 'Cases_SierraLeone',
'Cases_Nigeria', 'Cases_Senegal', 'Cases_UnitedStates', 'Cases_Spain',
'Cases_Mali', 'Deaths_Guinea', 'Deaths_Liberia', 'Deaths_SierraLeone',
'Deaths_Nigeria', 'Deaths_Senegal', 'Deaths_UnitedStates',
'Deaths_Spain', 'Deaths_Mali'],
dtype='object')
任意の列名のデータの取得
カラム名を指定して、任意のカラムだけ表示させます。
df[['Cases_UnitedStates','Deaths_UnitedStates']].head()
Cases_UnitedStates | Deaths_UnitedStates | |
---|---|---|
0 | NaN | NaN |
1 | NaN | NaN |
2 | NaN | NaN |
3 | NaN | NaN |
4 | NaN | NaN |
行数や列数を指定してデータを取得
df.iloc[[6,7],[0,3]]
Date | Cases_Liberia | |
---|---|---|
6 | 12/27/2014 | NaN |
7 | 12/24/2014 | 7977.0 |
ある条件を満たしたデータを取得
df[df['Deaths_Liberia'] > 3000][['Deaths_Liberia']]
Deaths_Liberia | |
---|---|
2 | 3496.0 |
3 | 3496.0 |
4 | 3471.0 |
5 | 3423.0 |
7 | 3413.0 |
9 | 3384.0 |
10 | 3376.0 |
12 | 3290.0 |
14 | 3177.0 |
16 | 3145.0 |
18 | 3016.0 |
カラムの削除
Deaths_Guineaというカラムを削除しています。
df.drop(['Deaths_Guinea'], axis=1, inplace=True)
df.columns
Index(['Date', 'Day', 'Cases_Guinea', 'Cases_Liberia', 'Cases_SierraLeone',
'Cases_Nigeria', 'Cases_Senegal', 'Cases_UnitedStates', 'Cases_Spain',
'Cases_Mali', 'Deaths_Liberia', 'Deaths_SierraLeone', 'Deaths_Nigeria',
'Deaths_Senegal', 'Deaths_UnitedStates', 'Deaths_Spain', 'Deaths_Mali'],
dtype='object')
統計量の取得
describe()を利用して、列ごとの統計量を取得することが出来ます。ぱっと見、概要を得たいときに有力です。
df.describe()
Day | Cases_Guinea | Cases_Liberia | Cases_SierraLeone | Cases_Nigeria | Cases_Senegal | Cases_UnitedStates | Cases_Spain | Cases_Mali | Deaths_Liberia | Deaths_SierraLeone | Deaths_Nigeria | Deaths_Senegal | Deaths_UnitedStates | Deaths_Spain | Deaths_Mali | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
count | 122.000000 | 93.000000 | 83.000000 | 87.000000 | 38.000000 | 25.00 | 18.000000 | 16.0 | 12.000000 | 81.000000 | 87.000000 | 38.000000 | 22.0 | 18.000000 | 16.000000 | 12.000000 |
mean | 144.778689 | 911.064516 | 2335.337349 | 2427.367816 | 16.736842 | 1.08 | 3.277778 | 1.0 | 3.500000 | 1101.209877 | 693.701149 | 6.131579 | 0.0 | 0.833333 | 0.187500 | 3.166667 |
std | 89.316460 | 849.108801 | 2987.966721 | 3184.803996 | 5.998577 | 0.40 | 1.178511 | 0.0 | 2.746899 | 1297.208568 | 869.947073 | 2.781901 | 0.0 | 0.383482 | 0.403113 | 2.405801 |
min | 0.000000 | 49.000000 | 3.000000 | 0.000000 | 0.000000 | 1.00 | 1.000000 | 1.0 | 1.000000 | 2.000000 | 0.000000 | 0.000000 | 0.0 | 0.000000 | 0.000000 | 1.000000 |
25% | 66.250000 | 236.000000 | 25.500000 | 64.500000 | 15.000000 | 1.00 | 3.000000 | 1.0 | 1.000000 | 12.000000 | 6.000000 | 4.000000 | 0.0 | 1.000000 | 0.000000 | 1.000000 |
50% | 150.000000 | 495.000000 | 516.000000 | 783.000000 | 20.000000 | 1.00 | 4.000000 | 1.0 | 2.500000 | 294.000000 | 334.000000 | 8.000000 | 0.0 | 1.000000 | 0.000000 | 2.000000 |
75% | 219.500000 | 1519.000000 | 4162.500000 | 3801.000000 | 20.000000 | 1.00 | 4.000000 | 1.0 | 6.250000 | 2413.000000 | 1176.000000 | 8.000000 | 0.0 | 1.000000 | 0.000000 | 6.000000 |
max | 289.000000 | 2776.000000 | 8166.000000 | 10030.000000 | 22.000000 | 3.00 | 4.000000 | 1.0 | 7.000000 | 3496.000000 | 2977.000000 | 8.000000 | 0.0 | 1.000000 | 1.000000 | 6.000000 |
また、value_countsメソッドを利用して、値の頻度を簡単に求める事ができます。今回用いたデータが連続量のため、少々わかりにくいですが、0.0のデータ数が15である事がわかります。その他のデータ数はすべて1個である事がわかります。
df['Deaths_Liberia'].value_counts()
11.0 9
12.0 4
3496.0 2
13.0 2
24.0 2
..
2963.0 1
88.0 1
3413.0 1
3177.0 1
105.0 1
Name: Deaths_Liberia, Length: 66, dtype: int64
インデックスをdatetime型に変更
インデックスをDateに変更し、上書きします。時系列データの場合、インデックスを日付にすると解析しやすいことが多いです。ただ、単純に文字列としてインデックスするよりも、pandaに標準で備わっているdatetime型に変換すると集計処理などが便利になります。
Dateというインデックス名をYYYYMMDDに変更します。。rename関数を利用します。
df.rename(columns={'Date':'YYYYMMDD'}, inplace=True)
df.set_index('YYYYMMDD', inplace=True)
df.index
Index(['1/5/2015', '1/4/2015', '1/3/2015', '1/2/2015', '12/31/2014',
'12/28/2014', '12/27/2014', '12/24/2014', '12/21/2014', '12/20/2014',
...
'4/4/2014', '4/1/2014', '3/31/2014', '3/29/2014', '3/28/2014',
'3/27/2014', '3/26/2014', '3/25/2014', '3/24/2014', '3/22/2014'],
dtype='object', name='YYYYMMDD', length=122)
df.head()
Day | Cases_Guinea | Cases_Liberia | Cases_SierraLeone | Cases_Nigeria | Cases_Senegal | Cases_UnitedStates | Cases_Spain | Cases_Mali | Deaths_Liberia | Deaths_SierraLeone | Deaths_Nigeria | Deaths_Senegal | Deaths_UnitedStates | Deaths_Spain | Deaths_Mali | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
YYYYMMDD | ||||||||||||||||
1/5/2015 | 289 | 2776.0 | NaN | 10030.0 | NaN | NaN | NaN | NaN | NaN | NaN | 2977.0 | NaN | NaN | NaN | NaN | NaN |
1/4/2015 | 288 | 2775.0 | NaN | 9780.0 | NaN | NaN | NaN | NaN | NaN | NaN | 2943.0 | NaN | NaN | NaN | NaN | NaN |
1/3/2015 | 287 | 2769.0 | 8166.0 | 9722.0 | NaN | NaN | NaN | NaN | NaN | 3496.0 | 2915.0 | NaN | NaN | NaN | NaN | NaN |
1/2/2015 | 286 | NaN | 8157.0 | NaN | NaN | NaN | NaN | NaN | NaN | 3496.0 | NaN | NaN | NaN | NaN | NaN | NaN |
12/31/2014 | 284 | 2730.0 | 8115.0 | 9633.0 | NaN | NaN | NaN | NaN | NaN | 3471.0 | 2827.0 | NaN | NaN | NaN | NaN | NaN |
df.columns
Index(['Day', 'Cases_Guinea', 'Cases_Liberia', 'Cases_SierraLeone',
'Cases_Nigeria', 'Cases_Senegal', 'Cases_UnitedStates', 'Cases_Spain',
'Cases_Mali', 'Deaths_Liberia', 'Deaths_SierraLeone', 'Deaths_Nigeria',
'Deaths_Senegal', 'Deaths_UnitedStates', 'Deaths_Spain', 'Deaths_Mali'],
dtype='object')
インデックスでソートします。ただ、日付が文字列のオブジェクトになっているので、目論見通りのソートになっていません。
df.sort_index(ascending=True).head()
Day | Cases_Guinea | Cases_Liberia | Cases_SierraLeone | Cases_Nigeria | Cases_Senegal | Cases_UnitedStates | Cases_Spain | Cases_Mali | Deaths_Liberia | Deaths_SierraLeone | Deaths_Nigeria | Deaths_Senegal | Deaths_UnitedStates | Deaths_Spain | Deaths_Mali | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
YYYYMMDD | ||||||||||||||||
1/2/2015 | 286 | NaN | 8157.0 | NaN | NaN | NaN | NaN | NaN | NaN | 3496.0 | NaN | NaN | NaN | NaN | NaN | NaN |
1/3/2015 | 287 | 2769.0 | 8166.0 | 9722.0 | NaN | NaN | NaN | NaN | NaN | 3496.0 | 2915.0 | NaN | NaN | NaN | NaN | NaN |
1/4/2015 | 288 | 2775.0 | NaN | 9780.0 | NaN | NaN | NaN | NaN | NaN | NaN | 2943.0 | NaN | NaN | NaN | NaN | NaN |
1/5/2015 | 289 | 2776.0 | NaN | 10030.0 | NaN | NaN | NaN | NaN | NaN | NaN | 2977.0 | NaN | NaN | NaN | NaN | NaN |
10/1/2014 | 193 | 1199.0 | 3834.0 | 2437.0 | 20.0 | 1.0 | 1.0 | NaN | NaN | 2069.0 | 623.0 | 8.0 | 0.0 | 0.0 | NaN | NaN |
インデックスをdatetime型に変更します。
df.index
Index(['1/5/2015', '1/4/2015', '1/3/2015', '1/2/2015', '12/31/2014',
'12/28/2014', '12/27/2014', '12/24/2014', '12/21/2014', '12/20/2014',
...
'4/4/2014', '4/1/2014', '3/31/2014', '3/29/2014', '3/28/2014',
'3/27/2014', '3/26/2014', '3/25/2014', '3/24/2014', '3/22/2014'],
dtype='object', name='YYYYMMDD', length=122)
df.index = pd.to_datetime(df.index, format='%m/%d/%Y')
df.index
DatetimeIndex(['2015-01-05', '2015-01-04', '2015-01-03', '2015-01-02',
'2014-12-31', '2014-12-28', '2014-12-27', '2014-12-24',
'2014-12-21', '2014-12-20',
...
'2014-04-04', '2014-04-01', '2014-03-31', '2014-03-29',
'2014-03-28', '2014-03-27', '2014-03-26', '2014-03-25',
'2014-03-24', '2014-03-22'],
dtype='datetime64[ns]', name='YYYYMMDD', length=122, freq=None)
となり、dtype=‘object’からobject=‘datetime64’とdatetime型に変更されていることが分かります。そこでソートしてみます。
df.sort_index(ascending=True, inplace=True)
df.head(10)
Day | Cases_Guinea | Cases_Liberia | Cases_SierraLeone | Cases_Nigeria | Cases_Senegal | Cases_UnitedStates | Cases_Spain | Cases_Mali | Deaths_Liberia | Deaths_SierraLeone | Deaths_Nigeria | Deaths_Senegal | Deaths_UnitedStates | Deaths_Spain | Deaths_Mali | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
YYYYMMDD | ||||||||||||||||
2014-03-22 | 0 | 49.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
2014-03-24 | 2 | 86.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
2014-03-25 | 3 | 86.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
2014-03-26 | 4 | 86.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
2014-03-27 | 5 | 103.0 | 8.0 | 6.0 | NaN | NaN | NaN | NaN | NaN | 6.0 | 5.0 | NaN | NaN | NaN | NaN | NaN |
2014-03-28 | 6 | 112.0 | 3.0 | 2.0 | NaN | NaN | NaN | NaN | NaN | 3.0 | 2.0 | NaN | NaN | NaN | NaN | NaN |
2014-03-29 | 7 | 112.0 | 7.0 | NaN | NaN | NaN | NaN | NaN | NaN | 2.0 | NaN | NaN | NaN | NaN | NaN | NaN |
2014-03-31 | 9 | 122.0 | 8.0 | 2.0 | NaN | NaN | NaN | NaN | NaN | 4.0 | 2.0 | NaN | NaN | NaN | NaN | NaN |
2014-04-01 | 10 | 127.0 | 8.0 | 2.0 | NaN | NaN | NaN | NaN | NaN | 5.0 | 2.0 | NaN | NaN | NaN | NaN | NaN |
2014-04-04 | 13 | 143.0 | 18.0 | 2.0 | NaN | NaN | NaN | NaN | NaN | 7.0 | 2.0 | NaN | NaN | NaN | NaN | NaN |
df.tail(10)
Day | Cases_Guinea | Cases_Liberia | Cases_SierraLeone | Cases_Nigeria | Cases_Senegal | Cases_UnitedStates | Cases_Spain | Cases_Mali | Deaths_Liberia | Deaths_SierraLeone | Deaths_Nigeria | Deaths_Senegal | Deaths_UnitedStates | Deaths_Spain | Deaths_Mali | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
YYYYMMDD | ||||||||||||||||
2014-12-20 | 272 | 2571.0 | 7862.0 | 8939.0 | NaN | NaN | NaN | NaN | NaN | 3384.0 | 2556.0 | NaN | NaN | NaN | NaN | NaN |
2014-12-21 | 273 | 2597.0 | NaN | 9004.0 | NaN | NaN | NaN | NaN | NaN | NaN | 2582.0 | NaN | NaN | NaN | NaN | NaN |
2014-12-24 | 277 | 2630.0 | 7977.0 | 9203.0 | NaN | NaN | NaN | NaN | NaN | 3413.0 | 2655.0 | NaN | NaN | NaN | NaN | NaN |
2014-12-27 | 280 | 2695.0 | NaN | 9409.0 | NaN | NaN | NaN | NaN | NaN | NaN | 2732.0 | NaN | NaN | NaN | NaN | NaN |
2014-12-28 | 281 | 2706.0 | 8018.0 | 9446.0 | NaN | NaN | NaN | NaN | NaN | 3423.0 | 2758.0 | NaN | NaN | NaN | NaN | NaN |
2014-12-31 | 284 | 2730.0 | 8115.0 | 9633.0 | NaN | NaN | NaN | NaN | NaN | 3471.0 | 2827.0 | NaN | NaN | NaN | NaN | NaN |
2015-01-02 | 286 | NaN | 8157.0 | NaN | NaN | NaN | NaN | NaN | NaN | 3496.0 | NaN | NaN | NaN | NaN | NaN | NaN |
2015-01-03 | 287 | 2769.0 | 8166.0 | 9722.0 | NaN | NaN | NaN | NaN | NaN | 3496.0 | 2915.0 | NaN | NaN | NaN | NaN | NaN |
2015-01-04 | 288 | 2775.0 | NaN | 9780.0 | NaN | NaN | NaN | NaN | NaN | NaN | 2943.0 | NaN | NaN | NaN | NaN | NaN |
2015-01-05 | 289 | 2776.0 | NaN | 10030.0 | NaN | NaN | NaN | NaN | NaN | NaN | 2977.0 | NaN | NaN | NaN | NaN | NaN |
となり、想定通りのソートになっている事が分かります。
また、datetime型がインデックスに設定されたので、日付を扱いのが容易になっています。 例えば、2015年のデータを取得するのに、以下の様になります。
df['2015']
Day | Cases_Guinea | Cases_Liberia | Cases_SierraLeone | Cases_Nigeria | Cases_Senegal | Cases_UnitedStates | Cases_Spain | Cases_Mali | Deaths_Liberia | Deaths_SierraLeone | Deaths_Nigeria | Deaths_Senegal | Deaths_UnitedStates | Deaths_Spain | Deaths_Mali | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
YYYYMMDD | ||||||||||||||||
2015-01-02 | 286 | NaN | 8157.0 | NaN | NaN | NaN | NaN | NaN | NaN | 3496.0 | NaN | NaN | NaN | NaN | NaN | NaN |
2015-01-03 | 287 | 2769.0 | 8166.0 | 9722.0 | NaN | NaN | NaN | NaN | NaN | 3496.0 | 2915.0 | NaN | NaN | NaN | NaN | NaN |
2015-01-04 | 288 | 2775.0 | NaN | 9780.0 | NaN | NaN | NaN | NaN | NaN | NaN | 2943.0 | NaN | NaN | NaN | NaN | NaN |
2015-01-05 | 289 | 2776.0 | NaN | 10030.0 | NaN | NaN | NaN | NaN | NaN | NaN | 2977.0 | NaN | NaN | NaN | NaN | NaN |
df['2014-12'].sort_index(ascending=True)
Day | Cases_Guinea | Cases_Liberia | Cases_SierraLeone | Cases_Nigeria | Cases_Senegal | Cases_UnitedStates | Cases_Spain | Cases_Mali | Deaths_Liberia | Deaths_SierraLeone | Deaths_Nigeria | Deaths_Senegal | Deaths_UnitedStates | Deaths_Spain | Deaths_Mali | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
YYYYMMDD | ||||||||||||||||
2014-12-03 | 256 | NaN | 7719.0 | NaN | NaN | NaN | NaN | NaN | NaN | 3177.0 | NaN | NaN | NaN | NaN | NaN | NaN |
2014-12-07 | 260 | 2292.0 | NaN | 7897.0 | 20.0 | 1.0 | 4.0 | 1.0 | 7.0 | NaN | 1768.0 | 8.0 | 0.0 | 1.0 | 0.0 | 6.0 |
2014-12-09 | 262 | NaN | 7797.0 | NaN | NaN | NaN | NaN | NaN | NaN | 3290.0 | NaN | NaN | NaN | NaN | NaN | NaN |
2014-12-14 | 267 | 2416.0 | NaN | 8356.0 | NaN | NaN | NaN | NaN | NaN | NaN | 2085.0 | NaN | NaN | NaN | NaN | NaN |
2014-12-18 | 271 | NaN | 7830.0 | NaN | NaN | NaN | NaN | NaN | NaN | 3376.0 | NaN | NaN | NaN | NaN | NaN | NaN |
2014-12-20 | 272 | 2571.0 | 7862.0 | 8939.0 | NaN | NaN | NaN | NaN | NaN | 3384.0 | 2556.0 | NaN | NaN | NaN | NaN | NaN |
2014-12-21 | 273 | 2597.0 | NaN | 9004.0 | NaN | NaN | NaN | NaN | NaN | NaN | 2582.0 | NaN | NaN | NaN | NaN | NaN |
2014-12-24 | 277 | 2630.0 | 7977.0 | 9203.0 | NaN | NaN | NaN | NaN | NaN | 3413.0 | 2655.0 | NaN | NaN | NaN | NaN | NaN |
2014-12-27 | 280 | 2695.0 | NaN | 9409.0 | NaN | NaN | NaN | NaN | NaN | NaN | 2732.0 | NaN | NaN | NaN | NaN | NaN |
2014-12-28 | 281 | 2706.0 | 8018.0 | 9446.0 | NaN | NaN | NaN | NaN | NaN | 3423.0 | 2758.0 | NaN | NaN | NaN | NaN | NaN |
2014-12-31 | 284 | 2730.0 | 8115.0 | 9633.0 | NaN | NaN | NaN | NaN | NaN | 3471.0 | 2827.0 | NaN | NaN | NaN | NaN | NaN |
さらに、平均や合計値などの統計値を、年や月単位で簡単に取得することができます。
df.resample('Y').mean()
Day | Cases_Guinea | Cases_Liberia | Cases_SierraLeone | Cases_Nigeria | Cases_Senegal | Cases_UnitedStates | Cases_Spain | Cases_Mali | Deaths_Liberia | Deaths_SierraLeone | Deaths_Nigeria | Deaths_Senegal | Deaths_UnitedStates | Deaths_Spain | Deaths_Mali | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
YYYYMMDD | ||||||||||||||||
2014-12-31 | 139.940678 | 848.988889 | 2191.481481 | 2162.488095 | 16.736842 | 1.08 | 3.277778 | 1.0 | 3.5 | 1040.582278 | 613.297619 | 6.131579 | 0.0 | 0.833333 | 0.1875 | 3.166667 |
2015-12-31 | 287.500000 | 2773.333333 | 8161.500000 | 9844.000000 | NaN | NaN | NaN | NaN | NaN | 3496.000000 | 2945.000000 | NaN | NaN | NaN | NaN | NaN |
df.resample('M').mean()
Day | Cases_Guinea | Cases_Liberia | Cases_SierraLeone | Cases_Nigeria | Cases_Senegal | Cases_UnitedStates | Cases_Spain | Cases_Mali | Deaths_Liberia | Deaths_SierraLeone | Deaths_Nigeria | Deaths_Senegal | Deaths_UnitedStates | Deaths_Spain | Deaths_Mali | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
YYYYMMDD | ||||||||||||||||
2014-03-31 | 4.500000 | 94.500000 | 6.500000 | 3.333333 | NaN | NaN | NaN | NaN | NaN | 3.750000 | 3.000000 | NaN | NaN | NaN | NaN | NaN |
2014-04-30 | 24.333333 | 177.818182 | 24.555556 | 2.200000 | NaN | NaN | NaN | NaN | NaN | 9.625000 | 1.111111 | NaN | NaN | NaN | NaN | NaN |
2014-05-31 | 51.888889 | 248.777778 | 12.555556 | 7.333333 | NaN | NaN | NaN | NaN | NaN | 11.111111 | 1.222222 | NaN | NaN | NaN | NaN | NaN |
2014-06-30 | 84.636364 | 373.428571 | 35.500000 | 125.571429 | NaN | NaN | NaN | NaN | NaN | 28.000000 | 29.375000 | NaN | NaN | NaN | NaN | NaN |
2014-07-31 | 115.700000 | 423.000000 | 212.300000 | 420.500000 | 1.333333 | NaN | NaN | NaN | NaN | 121.300000 | 189.500000 | 0.666667 | NaN | NaN | NaN | NaN |
2014-08-31 | 145.090909 | 559.818182 | 868.818182 | 844.000000 | 13.363636 | 1.000000 | NaN | NaN | NaN | 468.454545 | 353.000000 | 3.545455 | NaN | NaN | NaN | NaN |
2014-09-30 | 177.500000 | 967.888889 | 2815.625000 | 1726.000000 | 20.714286 | 1.285714 | NaN | NaN | NaN | 1508.000000 | 565.777778 | 8.000000 | 0.0 | NaN | NaN | NaN |
2014-10-31 | 207.470588 | 1500.444444 | 4758.750000 | 3668.111111 | 20.000000 | 1.000000 | 2.555556 | 1.0 | 1.0 | 2419.000000 | 1151.666667 | 8.000000 | 0.0 | 0.666667 | 0.428571 | 1.000 |
2014-11-30 | 237.214286 | 1950.500000 | 7039.000000 | 5843.625000 | 20.000000 | 1.000000 | 4.000000 | 1.0 | 4.0 | 2928.857143 | 1256.750000 | 8.000000 | 0.0 | 1.000000 | 0.000000 | 3.625 |
2014-12-31 | 271.181818 | 2579.625000 | 7902.571429 | 8985.875000 | 20.000000 | 1.000000 | 4.000000 | 1.0 | 7.0 | 3362.000000 | 2495.375000 | 8.000000 | 0.0 | 1.000000 | 0.000000 | 6.000 |
2015-01-31 | 287.500000 | 2773.333333 | 8161.500000 | 9844.000000 | NaN | NaN | NaN | NaN | NaN | 3496.000000 | 2945.000000 | NaN | NaN | NaN | NaN | NaN |
df.resample('Y').sum()
Day | Cases_Guinea | Cases_Liberia | Cases_SierraLeone | Cases_Nigeria | Cases_Senegal | Cases_UnitedStates | Cases_Spain | Cases_Mali | Deaths_Liberia | Deaths_SierraLeone | Deaths_Nigeria | Deaths_Senegal | Deaths_UnitedStates | Deaths_Spain | Deaths_Mali | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
YYYYMMDD | ||||||||||||||||
2014-12-31 | 16513 | 76409.0 | 177510.0 | 181649.0 | 636.0 | 27.0 | 59.0 | 16.0 | 42.0 | 82206.0 | 51517.0 | 233.0 | 0.0 | 15.0 | 3.0 | 38.0 |
2015-12-31 | 1150 | 8320.0 | 16323.0 | 29532.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 6992.0 | 8835.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
df.resample('M').sum()
Day | Cases_Guinea | Cases_Liberia | Cases_SierraLeone | Cases_Nigeria | Cases_Senegal | Cases_UnitedStates | Cases_Spain | Cases_Mali | Deaths_Liberia | Deaths_SierraLeone | Deaths_Nigeria | Deaths_Senegal | Deaths_UnitedStates | Deaths_Spain | Deaths_Mali | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
YYYYMMDD | ||||||||||||||||
2014-03-31 | 36 | 756.0 | 26.0 | 10.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 15.0 | 9.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
2014-04-30 | 365 | 1956.0 | 221.0 | 22.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 77.0 | 10.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
2014-05-31 | 467 | 2239.0 | 113.0 | 66.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 100.0 | 11.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
2014-06-30 | 931 | 2614.0 | 284.0 | 879.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 196.0 | 235.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
2014-07-31 | 1157 | 4230.0 | 2123.0 | 4205.0 | 4.0 | 0.0 | 0.0 | 0.0 | 0.0 | 1213.0 | 1895.0 | 2.0 | 0.0 | 0.0 | 0.0 | 0.0 |
2014-08-31 | 1596 | 6158.0 | 9557.0 | 9284.0 | 147.0 | 1.0 | 0.0 | 0.0 | 0.0 | 5153.0 | 3883.0 | 39.0 | 0.0 | 0.0 | 0.0 | 0.0 |
2014-09-30 | 2130 | 8711.0 | 22525.0 | 15534.0 | 145.0 | 9.0 | 0.0 | 0.0 | 0.0 | 12064.0 | 5092.0 | 56.0 | 0.0 | 0.0 | 0.0 | 0.0 |
2014-10-31 | 3527 | 13504.0 | 38070.0 | 33013.0 | 160.0 | 8.0 | 23.0 | 7.0 | 3.0 | 19352.0 | 10365.0 | 64.0 | 0.0 | 6.0 | 3.0 | 3.0 |
2014-11-30 | 3321 | 15604.0 | 49273.0 | 46749.0 | 160.0 | 8.0 | 32.0 | 8.0 | 32.0 | 20502.0 | 10054.0 | 64.0 | 0.0 | 8.0 | 0.0 | 29.0 |
2014-12-31 | 2983 | 20637.0 | 55318.0 | 71887.0 | 20.0 | 1.0 | 4.0 | 1.0 | 7.0 | 23534.0 | 19963.0 | 8.0 | 0.0 | 1.0 | 0.0 | 6.0 |
2015-01-31 | 1150 | 8320.0 | 16323.0 | 29532.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 6992.0 | 8835.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
とても便利です。さらに、datetime型のもう一つの利点として、.year
や.month
などのメソッドを利用して、年月日を取得することが出来ます。
df.index.year
Int64Index([2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014,
...
2014, 2014, 2014, 2014, 2014, 2014, 2015, 2015, 2015, 2015],
dtype='int64', name='YYYYMMDD', length=122)
df.index.month
Int64Index([ 3, 3, 3, 3, 3, 3, 3, 3, 4, 4,
...
12, 12, 12, 12, 12, 12, 1, 1, 1, 1],
dtype='int64', name='YYYYMMDD', length=122)
df.index.day
Int64Index([22, 24, 25, 26, 27, 28, 29, 31, 1, 4,
...
20, 21, 24, 27, 28, 31, 2, 3, 4, 5],
dtype='int64', name='YYYYMMDD', length=122)
cut処理(ヒストグラムの作成)
データの解析をしていると、データを特定の条件の下分割して、集計したいという場面がよくあります。例えば、季節ごとに集計したい場合などがあると思います。ちょっと月と季節が合っていませんが、季節でラベリングする例です。
labels = ['春', '夏', '秋', '冬']
df['season'] = pd.cut(list(df.index.month), bins=[0,3,6,9,12], labels=labels, right=True)
df[['season']][5:10]
season | |
---|---|
YYYYMMDD | |
2014-03-28 | 春 |
2014-03-29 | 春 |
2014-03-31 | 春 |
2014-04-01 | 夏 |
2014-04-04 | 夏 |
df[['season']][73:78]
season | |
---|---|
YYYYMMDD | |
2014-09-21 | 秋 |
2014-09-23 | 秋 |
2014-09-28 | 秋 |
2014-10-01 | 冬 |
2014-10-04 | 冬 |
query, where, maskの使い方 (ソートも)
numpyと同じように、queryやwhereなども使うことが出来ます。使い方は直感的にnumpyと同じなので、すぐに使えると思います。感染者と死者数でクエリを実行してみます。
queryは抽出したい条件式を指定します。
df[['Deaths_Liberia','Cases_Liberia']].query('Deaths_Liberia > 100 and Cases_Liberia > 7000')
Deaths_Liberia | Cases_Liberia | |
---|---|---|
YYYYMMDD | ||
2014-11-15 | 2964.0 | 7069.0 |
2014-11-18 | 2963.0 | 7082.0 |
2014-11-22 | 3016.0 | 7168.0 |
2014-11-28 | 3145.0 | 7635.0 |
2014-12-03 | 3177.0 | 7719.0 |
2014-12-09 | 3290.0 | 7797.0 |
2014-12-18 | 3376.0 | 7830.0 |
2014-12-20 | 3384.0 | 7862.0 |
2014-12-24 | 3413.0 | 7977.0 |
2014-12-28 | 3423.0 | 8018.0 |
2014-12-31 | 3471.0 | 8115.0 |
2015-01-02 | 3496.0 | 8157.0 |
2015-01-03 | 3496.0 | 8166.0 |
whereも条件を指定すると、条件を満たすデータはそのまま、見たさないデータはNaNが格納されたデータを返します。
df[['Deaths_Liberia']].where(df['Deaths_Liberia'] > 1000)
Deaths_Liberia | |
---|---|
YYYYMMDD | |
2014-03-22 | NaN |
2014-03-24 | NaN |
2014-03-25 | NaN |
2014-03-26 | NaN |
2014-03-27 | NaN |
... | ... |
2014-12-31 | 3471.0 |
2015-01-02 | 3496.0 |
2015-01-03 | 3496.0 |
2015-01-04 | NaN |
2015-01-05 | NaN |
122 rows × 1 columns
NaNではなく、別の数字を入れることも可能です。この辺はnumpyと同じでとても助かります。
df[['Deaths_Liberia']].where(df['Deaths_Liberia'] > 3000,0)
Deaths_Liberia | |
---|---|
YYYYMMDD | |
2014-03-22 | 0.0 |
2014-03-24 | 0.0 |
2014-03-25 | 0.0 |
2014-03-26 | 0.0 |
2014-03-27 | 0.0 |
... | ... |
2014-12-31 | 3471.0 |
2015-01-02 | 3496.0 |
2015-01-03 | 3496.0 |
2015-01-04 | 0.0 |
2015-01-05 | 0.0 |
122 rows × 1 columns
maskメソッドはwhereと逆で、条件を満たすものを第二引数に書き換えます。
df[['Deaths_Liberia']].mask(df['Deaths_Liberia'] > 3000, 0)
Deaths_Liberia | |
---|---|
YYYYMMDD | |
2014-03-22 | NaN |
2014-03-24 | NaN |
2014-03-25 | NaN |
2014-03-26 | NaN |
2014-03-27 | 6.0 |
... | ... |
2014-12-31 | 0.0 |
2015-01-02 | 0.0 |
2015-01-03 | 0.0 |
2015-01-04 | NaN |
2015-01-05 | NaN |
122 rows × 1 columns
nullの使い方
データにはしばしばNullが含まれるので、正しいデータ分析のためにはNullがどの程度含まれていて、それがどの程度解析に影響を及ぼすのか確認する必要があります。
isnull
によって、Nullの部分をFalseにしたテーブルを作成する事が出来ます。
df.isnull()
Day | Cases_Guinea | Cases_Liberia | Cases_SierraLeone | Cases_Nigeria | Cases_Senegal | Cases_UnitedStates | Cases_Spain | Cases_Mali | Deaths_Liberia | Deaths_SierraLeone | Deaths_Nigeria | Deaths_Senegal | Deaths_UnitedStates | Deaths_Spain | Deaths_Mali | season | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
YYYYMMDD | |||||||||||||||||
2014-03-22 | False | False | True | True | True | True | True | True | True | True | True | True | True | True | True | True | False |
2014-03-24 | False | False | True | True | True | True | True | True | True | True | True | True | True | True | True | True | False |
2014-03-25 | False | False | True | True | True | True | True | True | True | True | True | True | True | True | True | True | False |
2014-03-26 | False | False | True | True | True | True | True | True | True | True | True | True | True | True | True | True | False |
2014-03-27 | False | False | False | False | True | True | True | True | True | False | False | True | True | True | True | True | False |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
2014-12-31 | False | False | False | False | True | True | True | True | True | False | False | True | True | True | True | True | False |
2015-01-02 | False | True | False | True | True | True | True | True | True | False | True | True | True | True | True | True | False |
2015-01-03 | False | False | False | False | True | True | True | True | True | False | False | True | True | True | True | True | False |
2015-01-04 | False | False | True | False | True | True | True | True | True | True | False | True | True | True | True | True | False |
2015-01-05 | False | False | True | False | True | True | True | True | True | True | False | True | True | True | True | True | False |
122 rows × 17 columns
また、sumメソッドを利用すると、各カラムごとにNullの個数をカウントする事が出来ます。
df.isnull().sum()
Day 0
Cases_Guinea 29
Cases_Liberia 39
Cases_SierraLeone 35
Cases_Nigeria 84
Cases_Senegal 97
Cases_UnitedStates 104
Cases_Spain 106
Cases_Mali 110
Deaths_Liberia 41
Deaths_SierraLeone 35
Deaths_Nigeria 84
Deaths_Senegal 100
Deaths_UnitedStates 104
Deaths_Spain 106
Deaths_Mali 110
season 0
dtype: int64
同様に、meanメソッドで平均を出すことが出来ます。
df.isnull().mean()
Day 0.000000
Cases_Guinea 0.237705
Cases_Liberia 0.319672
Cases_SierraLeone 0.286885
Cases_Nigeria 0.688525
Cases_Senegal 0.795082
Cases_UnitedStates 0.852459
Cases_Spain 0.868852
Cases_Mali 0.901639
Deaths_Liberia 0.336066
Deaths_SierraLeone 0.286885
Deaths_Nigeria 0.688525
Deaths_Senegal 0.819672
Deaths_UnitedStates 0.852459
Deaths_Spain 0.868852
Deaths_Mali 0.901639
season 0.000000
dtype: float64
Nullのデータを書き換えます。fillna
というメソッドを利用します。
df.fillna(value={'Cases_Liberia': 0.0, 'Deaths_Liberia': 0.0}, inplace=True)
df.isnull().sum()
Day 0
Cases_Guinea 29
Cases_Liberia 0
Cases_SierraLeone 35
Cases_Nigeria 84
Cases_Senegal 97
Cases_UnitedStates 104
Cases_Spain 106
Cases_Mali 110
Deaths_Liberia 0
Deaths_SierraLeone 35
Deaths_Nigeria 84
Deaths_Senegal 100
Deaths_UnitedStates 104
Deaths_Spain 106
Deaths_Mali 110
season 0
dtype: int64
これで確かにCases_LiberiaとDeath_Liberiaのnullの数が0になりました。
また、ある列にNullがある行を削除することが出来ます。dropnaを適用した前後のデータ数を比較してみるとわかります。削除前は、
df.shape
(122, 17)
となります。削除後は以下の通りで、確かに削除されていることがわかります。
df.dropna(subset=['Cases_Nigeria'], axis=0).shape
(38, 17)
df.dropna(subset=['Cases_Nigeria'], axis=0).isnull().sum()
Day 0
Cases_Guinea 2
Cases_Liberia 0
Cases_SierraLeone 0
Cases_Nigeria 0
Cases_Senegal 13
Cases_UnitedStates 21
Cases_Spain 23
Cases_Mali 27
Deaths_Liberia 0
Deaths_SierraLeone 0
Deaths_Nigeria 0
Deaths_Senegal 16
Deaths_UnitedStates 21
Deaths_Spain 23
Deaths_Mali 27
season 0
dtype: int64
df.dropna(subset=['Cases_Nigeria'], axis=0).head()
Day | Cases_Guinea | Cases_Liberia | Cases_SierraLeone | Cases_Nigeria | Cases_Senegal | Cases_UnitedStates | Cases_Spain | Cases_Mali | Deaths_Liberia | Deaths_SierraLeone | Deaths_Nigeria | Deaths_Senegal | Deaths_UnitedStates | Deaths_Spain | Deaths_Mali | season | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
YYYYMMDD | |||||||||||||||||
2014-07-23 | 123 | 427.0 | 249.0 | 525.0 | 0.0 | NaN | NaN | NaN | NaN | 129.0 | 224.0 | 0.0 | NaN | NaN | NaN | NaN | 秋 |
2014-07-27 | 126 | 460.0 | 329.0 | 533.0 | 1.0 | NaN | NaN | NaN | NaN | 156.0 | 233.0 | 1.0 | NaN | NaN | NaN | NaN | 秋 |
2014-07-30 | 129 | 472.0 | 391.0 | 574.0 | 3.0 | NaN | NaN | NaN | NaN | 227.0 | 252.0 | 1.0 | NaN | NaN | NaN | NaN | 秋 |
2014-08-01 | 132 | 485.0 | 468.0 | 646.0 | 4.0 | NaN | NaN | NaN | NaN | 255.0 | 273.0 | 1.0 | NaN | NaN | NaN | NaN | 秋 |
2014-08-04 | 135 | 495.0 | 516.0 | 691.0 | 9.0 | NaN | NaN | NaN | NaN | 282.0 | 286.0 | 1.0 | NaN | NaN | NaN | NaN | 秋 |
列名やインデックス名の変更
上で既に出てきていますが、列名やインデックスの名前を変更したい場合はよくあります。renameメソッドを使います。
df.rename(columns={'before': 'after'}, inplace=True)
df.rename(index={'before': 'after'}, inplace=True)
SQL likeなメソッド
SQLおなじみのgroupbyがpandasで利用できます。こちらは個人的にはよく利用しますね。
df.groupby(['season'])['season'].count()
season
春 12
夏 35
秋 33
冬 42
Name: season, dtype: int64
CSVへ出力
メモリに格納されているすべてのデータを出力します。
df.to_csv('./out.csv')
!head -n 10 out.csv
YYYYMMDD,Day,Cases_Guinea,Cases_Liberia,Cases_SierraLeone,Cases_Nigeria,Cases_Senegal,Cases_UnitedStates,Cases_Spain,Cases_Mali,Deaths_Liberia,Deaths_SierraLeone,Deaths_Nigeria,Deaths_Senegal,Deaths_UnitedStates,Deaths_Spain,Deaths_Mali,season
2014-03-22,0,49.0,0.0,,,,,,,0.0,,,,,,,春
2014-03-24,2,86.0,0.0,,,,,,,0.0,,,,,,,春
2014-03-25,3,86.0,0.0,,,,,,,0.0,,,,,,,春
2014-03-26,4,86.0,0.0,,,,,,,0.0,,,,,,,春
2014-03-27,5,103.0,8.0,6.0,,,,,,6.0,5.0,,,,,,春
2014-03-28,6,112.0,3.0,2.0,,,,,,3.0,2.0,,,,,,春
2014-03-29,7,112.0,7.0,,,,,,,2.0,,,,,,,春
2014-03-31,9,122.0,8.0,2.0,,,,,,4.0,2.0,,,,,,春
2014-04-01,10,127.0,8.0,2.0,,,,,,5.0,2.0,,,,,,夏
df.to_csv('./out.csv', columns=['Deaths_Liberia'])
!head -n 10 out.csv
YYYYMMDD,Deaths_Liberia
2014-03-22,0.0
2014-03-24,0.0
2014-03-25,0.0
2014-03-26,0.0
2014-03-27,6.0
2014-03-28,3.0
2014-03-29,2.0
2014-03-31,4.0
2014-04-01,5.0
ヘッダーとインデックスを記述しないように出来ます。
df.to_csv('./out.csv', header=False, index=False)
!head -n 10 out.csv
0,49.0,0.0,,,,,,,0.0,,,,,,,春
2,86.0,0.0,,,,,,,0.0,,,,,,,春
3,86.0,0.0,,,,,,,0.0,,,,,,,春
4,86.0,0.0,,,,,,,0.0,,,,,,,春
5,103.0,8.0,6.0,,,,,,6.0,5.0,,,,,,春
6,112.0,3.0,2.0,,,,,,3.0,2.0,,,,,,春
7,112.0,7.0,,,,,,,2.0,,,,,,,春
9,122.0,8.0,2.0,,,,,,4.0,2.0,,,,,,春
10,127.0,8.0,2.0,,,,,,5.0,2.0,,,,,,夏
13,143.0,18.0,2.0,,,,,,7.0,2.0,,,,,,夏
その他追記
型変換
型を指定して上書きします。一括の変換の表記方法です。inplaceがなく、少し時間を使ってしまい、メモしておきます。
test = pd.DataFrame({'max':[1], 'min':[2], 'mean':[1.5]})
test.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1 entries, 0 to 0
Data columns (total 3 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 max 1 non-null int64
1 min 1 non-null int64
2 mean 1 non-null float64
dtypes: float64(1), int64(2)
memory usage: 152.0 bytes
test = test.astype({'max': float, 'min': float, 'mean': float})
test.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1 entries, 0 to 0
Data columns (total 3 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 max 1 non-null float64
1 min 1 non-null float64
2 mean 1 non-null float64
dtypes: float64(3)
memory usage: 152.0 bytes
よく使う関数
最後のまとめとして、良く使う関数をまとめておきます。個人的なsnipetみたいなものです。
インデックスの変更(既存のカラム名に変更)
df.set_index('xxxx')
カラム名の変更
df.rename(columns={'before': 'after'}, inplace=True)
df.rename(index={'before': 'after'}, inplace=True)
あるカラムでソートする
df.sort_values(by='xxx', ascending=True)
インデックスでソートする
df.sort_index()
datetime型の型変換
df.to_datetime()
NaNのカラムごとの個数
df.isnull().sum()
参考文献
- チートシート
- read_csvの全引数について解説してくれてます
- データ分析で頻出のPandas基本操作 実務レベルで重要な部分を丁寧に書かれています。とても参考になります。