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