Kei Minagawa's Blog

皆川圭(@keimina)のブログ、Pythonで試したことを書いていきます

(勉強会用資料)Python Pandas もくもく勉強会 in 新潟 #3

1. はじめに

新潟で Python Pandas もくもく勉強会 というものを主催しています。本記事はその 2019/08/21 に行われる勉強会で私が行う 5分LT の資料です。1週間くらい Pandas を使ってみて、記憶に残っているものをまとめました。

connpass.com

2019/08/21 の Pandas 勉強会用
updated: <2019-08-20 Tue>

Pandas 覚えたことまとめ

2. import 文

import pandas as pd
import numpy as np

3. 出現頻度のカウント

data = ['YES', 'YES', 'NO', 'NO', '-']
s = pd.Series(data)
# series の value_counts メソッドを使用する
s.value_counts()

# NO     2
# YES    2
# -      1
# dtype: int64

# DataFrame の場合
data = ['YES', 'YES', 'NO', 'NO', '-']
data2 = ['A', 'A', 'A', 'B', 'C']
s2 = pd.Series(data2)
df = pd.concat([s, s2], axis=1)
# df に value_counts メソッドは存在しない
# df の列全体に value_counts を適用するときは apply を使用するとできる
df.apply(lambda s: s.value_counts())

#        0    1
# -    1.0  NaN
# A    NaN  3.0
# B    NaN  1.0
# C    NaN  1.0
# NO   2.0  NaN
# YES  2.0  NaN

4. Excel あるある

4.1. 作者の主観により特定の行がデータの区切りとなっていると思われるエクセルをどうにかする

data = ['・赤い果物', 'いちご', 'りんご', '・緑色の果物', 'キウイ', 'メロン', '・紫色の果物', 'ぶどう']
s = pd.Series(data)
s

# 0     ・赤い果物
# 1       いちご
# 2       りんご
# 3    ・緑色の果物
# 4       キウイ
# 5       メロン
# 6    ・紫色の果物
# 7       ぶどう
# dtype: object

# DataFrame に変換(あとで pd.merged で結合できるようにするため)
df = s.to_frame()

# '・赤い果物', '・緑色の果物', '・紫色の果物' に共通の'・'を含む行を抽出、name属性を設定しておく
s2 = s[s.map(lambda x: '・' in x)]
s2.name = '種類'
s2

# 0     ・赤い果物
# 3    ・緑色の果物
# 6    ・紫色の果物
# Name: 種類, dtype: object

# DataFrame に変換(あとで pd.merged で結合できるようにするため)
df2 = s2.to_frame()

# インデックスをキーとして結合
df3 = pd.merge(df2, df, left_index=True, right_index=True, how='outer')
df3

#        種類       0
# 0   ・赤い果物   ・赤い果物
# 1     NaN     いちご
# 2     NaN     りんご
# 3  ・緑色の果物  ・緑色の果物
# 4     NaN     キウイ
# 5     NaN     メロン
# 6  ・紫色の果物  ・紫色の果物
# 7     NaN     ぶどう

# 「種類」列の NaN を 埋める
df3['種類'].fillna(method='ffill', inplace=True)
df3

#        種類       0
# 0   ・赤い果物   ・赤い果物
# 1   ・赤い果物     いちご
# 2   ・赤い果物     りんご
# 3  ・緑色の果物  ・緑色の果物
# 4  ・緑色の果物     キウイ
# 5  ・緑色の果物     メロン
# 6  ・紫色の果物  ・紫色の果物
# 7  ・紫色の果物     ぶどう

# df3 から s2 のインデックスの行を削除する
df3.drop(index=s2.index, inplace=True)
df3

#        種類    0
# 1   ・赤い果物  いちご
# 2   ・赤い果物  りんご
# 4  ・緑色の果物  キウイ
# 5  ・緑色の果物  メロン
# 7  ・紫色の果物  ぶどう