Pandasでよく使う23選

# はじめに
Pandasでよく使う処理をまとめる。使用する例は下記。

|    | 日付       | 購入店   | 種類   | 名称       |   数量 |     単価 |     価格 |
|---:|:-----------|:------|:-----|:---------|-----:|-------:|-------:|
|  0 | 2024-01-04 | A     | 家電   | 電球       |    4 |   1000 |   4000 |
|  1 | 2024-02-06 | A     | 家電   | 電子レンジ    |    1 |  50000 |  50000 |
|  2 | 2024-03-10 | A     | 家電   | テレビ      |    1 | 150000 | 150000 |
|  3 | 2024-05-06 | B     | 家電   | 洗濯機      |    1 | 200000 | 200000 |
|  4 | 2024-05-04 | B     | 家電   | エアコン     |    1 | 180000 | 180000 |
|  5 | 2024-07-10 | B     | 家電   | 照明器具     |    1 |  10000 |  10000 |
|  6 | 2024-10-13 | B     | 家電   | 電池       |    5 |    300 |   1500 |
|  7 | 2024-01-06 | C     | 家具   | 椅子       |    4 |  10000 |  40000 |
|  8 | 2024-02-07 | C     | 家具   | 机        |    1 |  50000 |  50000 |
|  9 | 2024-03-10 | D     | 家具   | タンス      |    1 |  70000 |  70000 |
| 10 | 2024-06-10 | D     | 家具   | 布団       |    2 |  30000 |  60000 |
| 11 | 2024-10-06 | D     | 家具   | 枕        |    2 |   5000 |  10000 |
| 12 | 2024-07-04 | C     | 文具   | シャープペンシル |    3 |    600 |   1800 |
| 13 | 2024-08-09 | C     | 文具   | ボールペン    |    3 |    300 |    900 |
| 14 | 2024-10-10 | C     | 文具   | 消しゴム     |    5 |    100 |    500 |
| 15 | 2024-05-06 | A     | 文具   | ノート      |   10 |    100 |   1000 |
| 16 | 2024-07-03 | B     | 文具   | ノート      |   10 |    100 |   1000 |
| 17 | 2024-04-12 | B     | 文具   | ボールペン    |    1 |    300 |    300 |

# よく使う操作23種類
No|定義|意味
---|---|---
1|df.shape|行列の数
2|df.index|行名
3|df.columns|列名
4|df.dtypes|列の種類
5|df['列名'].unique()|特定の列のパラメータ種類
6|df['列名'].value_counts()|特定の列のパラメータの集計
7|df[['列名1','列名2','列名3']]|列の切り取り。リストで列を列挙
8|df.head(行数)|先頭から指定した行数
9|df.tail(行数)|終端から指定した行数
10|df.iloc[ 行start:行end , 列start:列end ]|行列の切り取り。行、列ともスライスで表記
11|df.T|行と列の入れ替え
12|df.sum()|各列の集計。列を絞ることもできる。
13|df.sort_values('列名', ascending=False/True,ignore_index=False/True)|ソート<br>ascending=False(昇順)/True(降順)<br>ignore_index=False(index変更無)/True(index変更有)
14|df[df['A'].isin(['a','b'])]|フィルタ:A列が'a'か'b'の文字列
15|df[df['A'].str.contains('a')]|フィルタ:A列で'a'を含む文字列
16|df[df['A'].str.endswith('a')]|フィルタ:A列で'a'で終わるの文字列
17|df[df['A'].str.startswith('a')]|フィルタ:A列で'a'で始まるの文字列
18|df[df['A'].str.match('...')]|フィルタ:A列で3文字の文字列(正規表現)
19|df.query('式')|フィルタ:query('式')でフィルタした行を切り取り
20|df.iloc[df['列名'].idxmax()]|指定列の最大値の行を切り取り
21|df.iloc[df['列名'].idxmin()]|指定列の最小値の行を切り取り
22|df.fillna(数値 or 文字列)|nanを指定した数値、文字列へ一括変換する
23|df.to_markdown()<br>df.to_string()<br>df.to_dict()<br>df.to_json()<br>df.to_html()<br>df.to_clipboard()<br>|MarkDown形式出力<br>文字列形式出力<br>辞書形式出力<br>json形式出力<br>html形式出力<br>クリップボード形式出力


```python
import pandas as pd

dict = {
'日付': {0: '2024-01-04', 1: '2024-02-06', 2: '2024-03-10', 3: '2024-05-06', 4: '2024-05-04', 5: '2024-07-10', 6: '2024-10-13', 7: '2024-01-06', 8: '2024-02-07', 9: '2024-03-10', 10: '2024-06-10', 11: '2024-10-06', 12: '2024-07-04', 13: '2024-08-09', 14: '2024-10-10', 15: '2024-05-06', 16: '2024-07-03', 17: '2024-04-12'},
'購入店': {0: 'A', 1: 'A', 2: 'A', 3: 'B', 4: 'B', 5: 'B', 6: 'B', 7: 'C', 8: 'C', 9: 'D', 10: 'D', 11: 'D', 12: 'C', 13: 'C', 14: 'C', 15: 'A', 16: 'B', 17: 'B'},
'種類': {0: '家電', 1: '家電', 2: '家電', 3: '家電', 4: '家電', 5: '家電', 6: '家電', 7: '家具', 8: '家具', 9: '家具', 10: '家具', 11: '家具', 12: '文具', 13: '文具', 14: '文具', 15: '文具', 16: '文具', 17: '文具'},
'名称': {0: '電球', 1: '電子レンジ', 2: 'テレビ', 3: '洗濯機', 4: 'エアコン', 5: '照明器具', 6: '電池', 7: '椅子', 8: '机', 9: 'タンス', 10: '布団', 11: '枕', 12: 'シャープペンシル', 13: 'ボールペン', 14: '消しゴム', 15: 'ノート', 16: 'ノート', 17: 'ボー ルペン'},
'数量': {0: 4, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 5, 7: 4, 8: 1, 9: 1, 10: 2, 11: 2, 12: 3, 13: 3, 14: 5, 15: 10, 16: 10, 17: 1},
'単価': {0: 1000, 1: 50000, 2: 150000, 3: 200000, 4: 180000, 5: 10000, 6: 300, 7: 10000, 8: 50000, 9: 70000, 10: 30000, 11: 5000, 12: 600, 13: 300, 14: 100, 15: 100, 16: 100, 17: 300},
'価格': {0: 4000, 1: 50000, 2: 150000, 3: 200000, 4: 180000, 5: 10000, 6: 1500, 7: 40000, 8: 50000, 9: 70000, 10: 60000, 11: 10000, 12: 1800, 13: 900, 14: 500, 15: 1000, 16: 1000, 17: 300}
}
df = pd.DataFrame(dict)

# 1.行列の数---------------------------
print(df.shape)
# (18, 7)

# 2.行名-------------------------------
print(df.index)
# Int64Index([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17], dtype='int64')

# 3.列名-------------------------------
print(df.columns)
# Int64Index([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17], dtype='int64')

# 4.列の種類---------------------------
print(df.dtypes)
# 日付     object
# 購入店    object
# 種類     object
# 名称     object
# 数量      int64
# 単価      int64
# 価格      int64

# 5.特定の列のパラメータ種類-----------
print(df['種類'].unique())
# ['家電' '家具' '文具']

# 6.特定の列のパラメータの集計---------
print(df['種類'].value_counts())
# 家電    7
# 文具    6
# 家具    5


# 7.特定の列のパラメータの集計---------
print(df[['種類','名称']])
#    種類     名称
# 0  家電     電球
# 1  家電  電子レンジ
# 2  家電    テレビ
# 3  家電    洗濯機
# 4  家電   エアコン
# ...

# 8.先頭から指定した行数--------------
print(df.head(3))
#            日付 購入店  種類     名称  数量      単価      価格
# 0  2024-01-04   A  家電     電球   4    1000    4000
# 1  2024-02-06   A  家電  電子レンジ   1   50000   50000
# 2  2024-03-10   A  家電    テレビ   1  150000  150000


# 9.終端から指定した行数--------------
print(df.tail(3))
#             日付 購入店  種類      名称  数量   単価    価格
# 15  2024-05-06   A  文具     ノート  10  100  1000
# 16  2024-07-03   B  文具     ノート  10  100  1000
# 17  2024-04-12   B  文具  ボー ルペン   1  300   300


# 10.行と列の幅を絞る-------------------
print(df.iloc[:10,3:])
#       名称  数量      単価      価格
# 0     電球   4    1000    4000
# 1  電子レンジ   1   50000   50000
# 2    テレビ   1  150000  150000
# 3    洗濯機   1  200000  200000
# 4   エアコン   1  180000  180000
# 5   照明器具   1   10000   10000
# 6     電池   5     300    1500
# 7     椅子   4   10000   40000
# 8      机   1   50000   50000
# 9    タンス   1   70000   70000

# 11.行列入れ替え-----------------------
print(df.T)
#              0           1           2           3   ...          14          15          16          17
# 日付   2024-01-04  2024-02-06  2024-03-10  2024-05-06  ...  2024-10-10  2024-05-06  2024-07-03  2024-04-12
# 購入店           A           A           A           B  ...           C           A           B           B
# 種類           家電          家電          家電          家電  ...          文具          文具          文具          文具
# 名称           電球       電子レンジ         テレビ         洗濯機  ...        消しゴム         ノート         ノート      ボー ルペン
# 数量            4           1           1           1  ...           5          10          10           1
# 単価         1000       50000      150000      200000  ...         100         100         100         300
# 価格         4000       50000      150000      200000  ...         500        1000        1000         300
# 
# [7 rows x 18 columns]

# 12.降順、Index変更--------------------
print(df[['数量','単価','価格']].sum())
# 数量        56
# 単価    757800
# 価格    831000

# 13.昇順、Indexそのまま----------------
print(df.sort_values('単価', ascending=False,ignore_index=False).head(5))
#            日付 購入店  種類    名称  数量      単価      価格
# 3  2024-05-06   B  家電   洗濯機   1  200000  200000
# 4  2024-05-04   B  家電  エアコン   1  180000  180000
# 2  2024-03-10   A  家電   テレビ   1  150000  150000
# 9  2024-03-10   D  家具   タンス   1   70000   70000
# 8  2024-02-07   C  家具     机   1   50000   50000

# 13.降順、Index変更--------------------
print(df.sort_values('単価', ascending=True, ignore_index=True).head(5))
#            日付 購入店  種類      名称  数量   単価    価格
# 0  2024-05-06   A  文具     ノート  10  100  1000
# 1  2024-10-10   C  文具    消しゴム   5  100   500
# 2  2024-07-03   B  文具     ノート  10  100  1000
# 3  2024-04-12   B  文具  ボー ルペン   1  300   300
# 4  2024-08-09   C  文具   ボールペン   3  300   900

# 14.フィルタ:文字列指定
print( df[df['購入店'].isin(['A','C'])] )
#             日付 購入店  種類        名称  数量      単価      価格
# 0   2024-01-04   A  家電        電球   4    1000    4000
# 1   2024-02-06   A  家電     電子レンジ   1   50000   50000
# 2   2024-03-10   A  家電       テレビ   1  150000  150000
# 7   2024-01-06   C  家具        椅子   4   10000   40000
# 8   2024-02-07   C  家具         机   1   50000   50000
# 12  2024-07-04   C  文具  シャープペンシル   3     600    1800
# 13  2024-08-09   C  文具     ボールペン   3     300     900
# 14  2024-10-10   C  文具      消しゴム   5     100     500
# 15  2024-05-06   A  文具       ノート  10     100    1000

# 15.フィルタ:含む文字列
print( df[df['日付'].str.contains('2024-05')] )
#             日付 購入店  種類    名称  数量      単価      価格
# 3   2024-05-06   B  家電   洗濯機   1  200000  200000
# 4   2024-05-04   B  家電  エアコン   1  180000  180000
# 15  2024-05-06   A  文具   ノート  10     100    1000

# 16.フィルタ:終端文字列比較
print( df[df['種類'].str.endswith('電')] )
#            日付 購入店  種類     名称  数量      単価      価格
# 0  2024-01-04   A  家電     電球   4    1000    4000
# 1  2024-02-06   A  家電  電子レンジ   1   50000   50000
# 2  2024-03-10   A  家電    テレビ   1  150000  150000
# 3  2024-05-06   B  家電    洗濯機   1  200000  200000
# 4  2024-05-04   B  家電   エアコン   1  180000  180000
# 5  2024-07-10   B  家電   照明器具   1   10000   10000
# 6  2024-10-13   B  家電     電池   5     300    1500

# 17.フィルタ:開始文字列比較
print( df[df['種類'].str.startswith('家')] )
#             日付 購入店  種類     名称  数量      単価      価格
# 0   2024-01-04   A  家電     電球   4    1000    4000
# 1   2024-02-06   A  家電  電子レンジ   1   50000   50000
# 2   2024-03-10   A  家電    テレビ   1  150000  150000
# 3   2024-05-06   B  家電    洗濯機   1  200000  200000
# 4   2024-05-04   B  家電   エアコン   1  180000  180000
# 5   2024-07-10   B  家電   照明器具   1   10000   10000
# 6   2024-10-13   B  家電     電池   5     300    1500
# 7   2024-01-06   C  家具     椅子   4   10000   40000
# 8   2024-02-07   C  家具      机   1   50000   50000
# 9   2024-03-10   D  家具    タンス   1   70000   70000
# 10  2024-06-10   D  家具     布団   2   30000   60000
# 11  2024-10-06   D  家具      枕   2    5000   10000


# 18.フィルタ:正規表現文字列比較
print( df[df['名称'].str.match('^.{3}$')] )
#             日付 購入店  種類   名称  数量      単価      価格
# 2   2024-03-10   A  家電  テレビ   1  150000  150000
# 3   2024-05-06   B  家電  洗濯機   1  200000  200000
# 9   2024-03-10   D  家具  タンス   1   70000   70000
# 15  2024-05-06   A  文具  ノート  10     100    1000
# 16  2024-07-03   B  文具  ノート  10     100    1000

# 19.フィルタ:query()
print(df.query('価格>10000 and 購入店=="A"'))
#            日付 購入店  種類     名称  数量      単価      価格
# 1  2024-02-06   A  家電  電子レンジ   1   50000   50000
# 2  2024-03-10   A  家電    テレビ   1  150000  150000


# 20.指定列の最大値の行-----------------
print(df.iloc[df['価格'].idxmax()])
# 日付     2024-05-06
# 購入店             B
# 種類             家電
# 名称            洗濯機
# 数量              1
# 単価         200000
# 価格         200000

# 21.指定列の最大値の行-----------------
print(df.iloc[df['価格'].idxmin()])
# 日付     2024-04-12
# 購入店             B
# 種類             文具
# 名称         ボー ルペン
# 数量              1
# 単価            300
# 価格            300

#22.Nanを'0'で埋める-------------------
df.fillna(0)
#例はNonがないので変化なし

# 23.出力------------------------------
df.to_html('out.json')
df.to_html('out.html')
df.to_string('out.txt')
df.to_clipboard()
```