#この記事を読む前に
これは自分が忘れないように記したものに少し情報を足してまとめたものです。
読みにくい、分かりにくい場合があれば修正しますのでコメントください。
引用先:https://www.geeksforgeeks.org/python-pandas-dataframe/
###使用する開発環境
- anaconda
- Pycharm
- Python3.7.7
編集履歴
-2020/04/05
-2020/04/05
--追記 データの削除
#Pandasを始める前に
#インストール、インポート
pip install pandas
import pandas as pd
#では実際にpandasをいじってみます。
##データを取得
pandasを用いて、何かしたい場合、取得必要があります。
csvなどにして準備しておきます。
今回はコロナウイルスの感染者(兵庫県)を使ってみます。
url = "https://web.pref.hyogo.lg.jp/kk03/corona_hasseijyokyo.html"
dfs = pd.read_html(url)
print(dfs[0].head())
#プロンプト上でHTMLの表を表示する
>>>
0 1 2 3 4 5 6
0 番号 年代 性別 居住地 職業 発表日 備考
1 162 40 男性 神戸市 医師 4月1日 NaN
2 161 20 男性 伊丹健康福祉事務所管内 会社員 4月1日 NaN
3 160 50 女性 宝塚市 無職 4月1日 NaN
4 159 60 男性 宝塚市 医師 4月1日 NaN
#HTML上の表をcsvにする。
#テキストエディタ
import csv
tables = pd.read_html("https://web.pref.hyogo.lg.jp/kk03/corona_hasseijyokyo.html", header=0)
data = tables[0]
data.to_csv("coronaHyogo.csv", index=False) # 出力
##CSVの読み込み
dfs = pd.read_csv('C:/Users/Desktop/coronaHyogo.csv')
print (dfs)
#CSVをpandasで開く
>>>
番号 年代 性別 居住地 職業 発表日 備考
0 169 40 男性 尼崎市 会社員 4月2日 NaN
1 168 60 男性 芦屋市 会社員 4月2日 NaN
2 167 50 男性 伊丹健康福祉事務所管内 会社員 4月2日 NaN
3 166 20 女性 伊丹市 NaN 4月2日 NaN
4 165 20 男性 明石市 NaN 4月2日 NaN
.. ... .. .. ... ... ... ...
64 105 70 男性 伊丹市 無職 3月21日 NaN
65 104 80 女性 宝塚市 無職 3月21日 死亡
66 103 60 男性 尼崎市 会社員 3月21日 NaN
67 102 40 女性 帰国者(姫路市保健所発表分) 無職 3月21日 NaN
68 101 20 男性 尼崎市 学生 3月20日 NaN
##データの確認
dfs.shape #dataframeの行数・列数の確認
>>> (69, 7)
dfs.index #indexの確認
>>> RangeIndex(start=0, stop=69, step=1)
dfs.columns #columnの確認
>>> Index(['番号', '年代', '性別', '居住地', '職業', '発表日', '備考'], dtype='object')
dfs.dtypes #dataframeの各列のデータ型を確認
>>>
番号 int64
年代 int64
性別 object
居住地 object
職業 object
発表日 object
備考 object
dtype: object
##情報の抜き出し
df.head(3)
#頭から3行目まで抜き出す。
>>>
番号 年代 性別 居住地 職業 発表日 備考
0 169 40 男性 尼崎市 会社員 4月2日 NaN
1 168 60 男性 芦屋市 会社員 4月2日 NaN
2 167 50 男性 伊丹健康福祉事務所管内 会社員 4月2日 NaN
dfs.tail()
#後ろから抜き出す。
>>>
番号 年代 性別 居住地 職業 発表日 備考
64 105 70 男性 伊丹市 無職 3月21日 NaN
65 104 80 女性 宝塚市 無職 3月21日 死亡
66 103 60 男性 尼崎市 会社員 3月21日 NaN
67 102 40 女性 帰国者(姫路市保健所発表分) 無職 3月21日 NaN
68 101 20 男性 尼崎市 学生 3月20日 NaN
dfs[["年代","性別","発表日"]].head()
#列を指定して抜き出す。
>>>
年代 性別 発表日
0 40 男性 4月2日
1 60 男性 4月2日
2 50 男性 4月2日
3 20 女性 4月2日
4 20 男性 4月2日
row2 = dfs.iloc[3]
print(row2)
#上から3番目のデータのみを表示する。
>>>
番号 166
年代 20
性別 女性
居住地 伊丹市
職業 NaN
発表日 4月2日
備考 NaN
##データの整形
dfs.rename(columns={'性別': 'sex'}, inplace=True)
dfs.head()
#名称の変更(性別をsexに)
>>>
番号 年代 sex 居住地 職業 発表日 備考
0 169 40 男性 尼崎市 会社員 4月2日 NaN
1 168 60 男性 芦屋市 会社員 4月2日 NaN
2 167 50 男性 伊丹健康福祉事務所管内 会社員 4月2日 NaN
dfs.set_index('年代', inplace=True)
dfs.head()
#
>>>
番号 性別 居住地 職業 発表日 備考
年代
40 169 男性 尼崎市 会社員 4月2日 NaN
60 168 男性 芦屋市 会社員 4月2日 NaN
50 167 男性 伊丹健康福祉事務所管内 会社員 4月2日 NaN
dfs.index
>>>
Int64Index([40, 60, 50, 20, 20, 70, 50, 40, 20, 50, 60, 60, 60, 10, 30, 60, 10,
30, 20, 60, 60, 30, 60, 60, 20, 70, 60, 20, 20, 30, 40, 40, 30, 20,
20, 50, 30, 70, 60, 60, 70, 20, 60, 30, 50, 40, 30, 10, 50, 70, 20,
80, 20, 80, 40, 70, 30, 80, 60, 70, 40, 70, 90, 80, 70, 80, 60, 40,
20],
df.sort_values(by="年代", ascending=True).head() # ascending=Trueで昇順
# '年代'列を降順
# df.sort_values(['年代', '発表日'], ascending=False).head() #複数個も可能
>>>
番号 sex 居住地 職業 発表日 備考
年代
10 122 女性 神戸市 学生 3月27日 NaN
10 153 女性 尼崎市 学生 4月1日 NaN
10 156 女性 川西市 専門学校生 4月1日 NaN
20 135 女性 伊丹健康福祉事務所管内 会社員 3月30日 NaN
20 117 男性 西宮市 医師 3月24日 NaN
#データの削除
print(df.drop(columns=['番号','居住地']))
##データの数を数える
dfs['年代'].value_counts()
60 15
20 13
70 9
30 9
40 8
50 6
80 5
10 3
90 1
Name: 年代, dtype: int64
##統計的指標を求める
#平均
mean = dfs['年代'].mean()
print(mean) #46.3768115942029
# 合計
sum = dfs['年代'].sum()
print(sum) #3200
# 中央値
median = dfs['年代'].median()
print(median) #50.0
# 最大値
dfsmax = dfs['年代'].max()
print(dfsmax) #90
# 最小値
dfsmin = dfs['年代'].min()
print(dfsmin) #10
# 標準偏差
std = dfs['年代'].std()
print(std) #21.418176344401118
# 分散
var = dfs['年代'].var()
print(var) #458.73827791986366