見出し画像

【python】csv,excelの取り込み、加工、出力まとめ②

csvやエクセルの整理をpandasで行うときに使うコマンドまとめ。DataFrameの加工。

取り込み編はこちら

DataFrameを加工する

例えば以下のようなDataFrameを加工する

import pandas as pd

df1 = pd.DataFrame(
  data = {"取引": list(range(5)),
    "詳細": ["ぶどう購入", "だいこん購入", "何もしなかった", "りんご購入", "手伝いした"],
    "収入": [None,None,None,None,1000],
    "支出": [100,200,None,800,None],
    "残高": [900,700,None,-100,900]}
)

"None"はDataFrameで欠損値として扱われる。読み込んだcsvの空白も同様。

>>> print(df1)
   取引       詳細      収入     支出     残高
0   0    ぶどう購入     NaN  100.0  900.0
1   1   だいこん購入     NaN  200.0  700.0
2   2  何もしなかった     NaN    NaN    NaN
3   3    りんご購入     NaN  800.0 -100.0
4   4    手伝いした  1000.0    NaN  900.0

欠損値を埋める

fillna()を利用する。全ての欠損値を文字列"----"で埋める

DataFrameすべての欠損値を埋める

df1 = df1.fillna("----")
>>> print(df1)
   取引       詳細      収入     支出     残高
0   0    ぶどう購入    ----  100.0  900.0
1   1   だいこん購入    ----  200.0  700.0
2   2  何もしなかった    ----   ----   ----
3   3    りんご購入    ----  800.0 -100.0
4   4    手伝いした  1000.0   ----  900.0

列ごとに違う値で埋める

df1 = df1.fillna({"収入": 0, "支出": 0, "残高": "----"})
>>> print(df1)
   取引       詳細      収入     支出     残高
0   0    ぶどう購入     0.0  100.0  900.0
1   1   だいこん購入     0.0  200.0  700.0
2   2  何もしなかった     0.0    0.0   ----
3   3    りんご購入     0.0  800.0 -100.0
4   4    手伝いした  1000.0    0.0  900.0

列を指定して一つ上の値で埋める

df1["残高"] = df1["残高"].fillna(method="ffill")
>>> print(df1)
   取引       詳細      収入     支出     残高
0   0    ぶどう購入     NaN  100.0  900.0
1   1   だいこん購入     NaN  200.0  700.0
2   2  何もしなかった     NaN    NaN  700.0
3   3    りんご購入     NaN  800.0 -100.0
4   4    手伝いした  1000.0    NaN  900.0

列の値に対して処理を行う

A列に特定の文字列を含む場合、B列を任意の文字列で更新する

"詳細"列に"ぶどう"または"りんご"が含まれていたら"カテゴリ"列に"くだもの"を記載する。

df1.loc[df1["詳細"].str.contains("ぶどう|りんご"), "カテゴリ"] = "くだもの"
>>> print(df1)
   取引       詳細      収入     支出     残高  カテゴリ
0   0    ぶどう購入     NaN  100.0  900.0  くだもの
1   1   だいこん購入     NaN  200.0  700.0   NaN
2   2  何もしなかった     NaN    NaN    NaN   NaN
3   3    りんご購入     NaN  800.0 -100.0  くだもの
4   4    手伝いした  1000.0    NaN  900.0   NaN

1つずつコードを見る。
列に対してstr.containsでテキスト検索ができる。検索する文字列を引数に登録する。複数の場合はパイプで区切る。

>>> print(df1["詳細"].str.contains("ぶどう|りんご"))
0     True
1    False
2    False
3     True
4    False
Name: 詳細, dtype: bool

戻り値はbool型のpandas.series

>>> print(type(df1["詳細"].str.contains("ぶどう|りんご")))
<class 'pandas.core.series.Series'>

DataFrameでTrueの行抽出ができる。

>>> print(df1[df1["詳細"].str.contains("ぶどう|りんご")])
   取引     詳細  収入     支出     残高
0   0  ぶどう購入 NaN  100.0  900.0
3   3  りんご購入 NaN  800.0 -100.0

locの引数の2つ目に列を指定して値を代入できる。

df1.loc[df1["詳細"].str.contains("ぶどう" | "りんご"), "カテゴリ"] = "くだもの"

A列の数値が特定の数値以下の場合、任意の値で上書きする

"残高"がマイナスの場合、0で上書きする

df1.loc[df1["残高"] < 0, "残高"] = 0
>>> print(df1)
   取引       詳細      収入     支出     残高
0   0    ぶどう購入     NaN  100.0  900.0
1   1   だいこん購入     NaN  200.0  700.0
2   2  何もしなかった     NaN    NaN    NaN
3   3    りんご購入     NaN  800.0    0.0
4   4    手伝いした  1000.0    NaN  900.0

A列の数値の符号を反転する

"支出"列の符号を反転する。

df1["支出"] = - df1["支出"]
>>> print(df1)
   取引       詳細      収入     支出     残高
0   0    ぶどう購入     NaN -100.0  900.0
1   1   だいこん購入     NaN -200.0  700.0
2   2  何もしなかった     NaN    NaN    NaN
3   3    りんご購入     NaN -800.0 -100.0
4   4    手伝いした  1000.0    NaN  900.0

結合する

DataFrameを2つ作って結合する。

>>> print(df1)
   取引       詳細      収入     支出     残高
0   0    ぶどう購入     NaN  100.0  900.0
1   1   だいこん購入     NaN  200.0  700.0
2   2  何もしなかった     NaN    NaN    NaN
3   3    りんご購入     NaN  800.0 -100.0
4   4    手伝いした  1000.0    NaN  900.0

>>> print(df2)
   取引       詳細      収入     支出   残高
0   3    りんご購入     NaN  800.0 -100
1   4    手伝いした  1000.0    NaN  900
2   5  じゃがいも購入     NaN  500.0  400

concatの引数にリストでDataFrameを指定する。

df3 = pd.concat([df1,df2])
>>> print(df3)
   取引       詳細      収入     支出     残高
0   0    ぶどう購入     NaN  100.0  900.0
1   1   だいこん購入     NaN  200.0  700.0
2   2  何もしなかった     NaN    NaN    NaN
3   3    りんご購入     NaN  800.0 -100.0
4   4    手伝いした  1000.0    NaN  900.0
0   3    りんご購入     NaN  800.0 -100.0
1   4    手伝いした  1000.0    NaN  900.0
2   5  じゃがいも購入     NaN  500.0  400.0

重複を削除する

drop_duplicates()は重複行を削除する。引数keepにfirstを指定すると最初の行を残す。

df3 = df3.drop_duplicates(keep="first")
>>> print(df3)
   取引       詳細      収入     支出     残高
0   0    ぶどう購入     NaN  100.0  900.0
1   1   だいこん購入     NaN  200.0  700.0
2   2  何もしなかった     NaN    NaN    NaN
3   3    りんご購入     NaN  800.0 -100.0
4   4    手伝いした  1000.0    NaN  900.0
2   5  じゃがいも購入     NaN  500.0  400.0

indexを振りなおす

DataFrameのindexは重複が許されている。

>>> print(df3)
   index  取引       詳細      収入     支出     残高
0      0   0    ぶどう購入     NaN  100.0  900.0
1      1   1   だいこん購入     NaN  200.0  700.0
2      2   2  何もしなかった     NaN    NaN    NaN
3      3   3    りんご購入     NaN  800.0 -100.0
4      4   4    手伝いした  1000.0    NaN  900.0
5      2   5  じゃがいも購入     NaN  500.0  400.0

結合や重複削除などの操作を行うとindexが重複する。reset_index()を利用する。

df3 = df3.reset_index(drop=True)
>>> print(df3)
   取引       詳細      収入     支出     残高
0   0    ぶどう購入     NaN  100.0  900.0
1   1   だいこん購入     NaN  200.0  700.0
2   2  何もしなかった     NaN    NaN    NaN
3   3    りんご購入     NaN  800.0 -100.0
4   4    手伝いした  1000.0    NaN  900.0
5   5  じゃがいも購入     NaN  500.0  400.0


興味があること #育児 #料理 #ものづくり 楽しんで学んでいきたいです。 皆さんの【楽しんでいること】も是非、教えてください。