忍者ブログ
物理学者(ポスドク)による日々の研究生活のメモ書きです ( python/emacs/html/Japascript/シェルスクリプト/TeX/Mac/C言語/Linux/git/tmux/R/ポケモンGO)
pythonのpandasでcsvを開いて、条件を満たす行に加工をする + ある行をファイル末尾にコピーして追記したい

pandasというのを使うのは初めてだった
・勝手にindexという列ができていたり、そのindexは加工不可だったりで色々と大変だった・・・
・astropyの単位みたいに、printしたら勝手にヘッダーにあるkeyも表示されてたりしてその対処が必要
・ある列、ある行の要素を取り出すのに、リストみたいに通し番号で指定できるのかと思ったらそれはできなかった・・・ ilocといかいうのを使う必要がある


コード
import pandas as pd

df = pd.read_csv('hoge.csv')

fname="hoge.png"

# このcsvの中で、filenameという要素で"hoge.png"を含んでいる行を抽出する
print(df[df["filename"] == fname])

# もしその行の通し番号が欲しかったら
list(df[df["filename"] == fname].index)
# これで
# [13, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 134, 180]
# が手に入る

#
# filenameという要素がhoge.pngを含んでいる行のdateを更新する
# 頭にシャープをいれてコメントアウト(csvのコメントアウトの文字はないと思うけど、読み込めなくできればOKなので・・・)
#
ll = df[df["filename"] == fname]
line_to_add = ll.iloc[0].values
for i in list(ll.index):
 df.loc[df.index==i, ["date"]] = "#" + df.loc[df.index==i, ["date"]]

# ファイルの末尾に、ある行をコピーして追記する
n = len(df["aaa"])
df.loc[n] = line_to_add

# 追加した行の他の要素を修正する
df.loc[n, ["x"]] = 1111
df.loc[n, ["y"]] = 2222

# 修正後のdfをcsvとして保存する
df.to_csv('hoge.csv', index=False)




以下、メモ

pd.read_csvはファイルを開いて、読み込んで、さらに閉じてくれるのでその後の処理が楽

■ 参考 : pythonでのcsvファイルの読み込み

最初はpandasのreplaceでなんとかすればいいと思ったが、うまくいかなかった

■ 参考 : pandas.DataFrame, Seriesの要素の値を置換するreplace



pandasで読み込んだcsvのindexをいじりたいとき用↓
df1 = df.set_index("filename")
とか

■ 参考 : pandasでcsvの読み込みをしてIndexをいじってみる


■ 参考 : pandas.DataFrameの列をインデックス(行名)に割り当てるset_index



いつか使うかも
これは便利そう
indexにdatatime型を指定すると、ある日付の範囲のデータのみを取り出す、とかがかんたんにできる
■ 参考 : pandasのindexはdatetimeにすると便利



ファイル末尾に追加する方法について
最初はappendでやろうとしたが、うまくいかなかった

一応メモ↓
■ 参考 : pandas.DataFrameに列や行を追加(assign, appendなど)

今回は
n = len(df["gain"])
df.loc[n] = df[df.index==13].values[0]
みたいにして追加した

任意の位置の値を取得するには at, iat, loc, ilocを使う
今回はilocしか使ってないけど・・・

■ 参考 : pandasで任意の位置の値を取得・変更するat, iat, loc, iloc



ilocとかを使わずにdfをfor文に打ち込むと、warningが出る
chained indexingというらしい

■ 参考 : pandas の SettingWithCopyWarning で苦労した話

■ 参考 : pandasのSettingWithCopyWarningの対処法






修正したdfをcsvでもう一度書き出す方法
index=Falseを付けないと、indexという列が新しく追加されるので注意
あと、headerがいるかどうかも選べる

■ 参考 : Pandasのto_csv関数を使ってCSVファイルに書き出す方法





(2022/12/19 追記)

data frameの仕様でハマったのでメモ

data frameの内容をコピーするのに = を使うと参照渡し(C言語のアドレス)みたいなことになって、単純な値をコピーすることにはならない
コピー元が修正されたら、=の左辺も置き換わってしまう(ここにハマった・・・)

(これは別にdata frameに限った話じゃなくてpythonもこういう仕様らしい、が今の所これで変なことが起こったことはないんだよなぁ・・ 謎)

単純な値のコピーをしたいなら、
hoge = df.copy(deep=True)

deepcopyというのは新しいidで作成されるので、新しい変数になる






PR
この記事にコメントする
Name
Title
Color
E-Mail
URL
Comment
Password   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
プロフィール
HN:coffee
職業:物理屋(自称)
趣味:映画鑑賞、登山
出身:大阪府の南の田舎
自己紹介:
import MyProfile
import coffee_pote from TWITTER
import amazonのほしい物リスト from WISH_LIST

print "先月子供が産まれました!"

# 最終更新 2022/10/25
カウンター
カウンター カウンター
ブログ内検索
ツイートするボタン
リンク
相互リンク募集中です (Twitterにてお知らせください)

Demo scripts for gnuplot version 5
(gnuplotのさまざまなデモ画像と作り方がまとめられている、眺めているだけでできるようになった気分になれる)

gnuplotスクリプトの解説
(米澤進吾さんの個人ページ、gnuplotと言えばこのかた)

gnuplot のページ
(Takeno Lab、うちのブログがリンクされていたのでリンク返し)

Twitterから映画の評価が分かる & 映画の鑑賞記録が残せる coco
(映画の感想をまとめられるサイト、いつもお世話になっています)

Astronomy Picture of the Day Archive
(天文や宇宙関連の最新の話題について画像とともにNASAが説明しているページ)

今日のほしぞら
(任意の時刻の空で見える星を表示してくれる、国立天文台が管理している)

GNUPLOTとアニメーション
(応用の項目の「見せてあげよう!ラピュタの雷を!!」あたりからすごすぎる)

読書メーター
(読んだ本をリストできる便利なサイト)

flickr難民の写真置き場
(20XX年、flickrは有料化の炎に包まれた。あらゆるflickr無料ユーザーは絶滅したかに見えた。 しかし、tumblr移住民は死に絶えてはいなかった。)

教授でもできるMac OS X へのLaTeX, X11, gccのインストレーションと環境設定
(阪大の山中卓さんのwebページ、タイトルにセンスが溢れている、内容は超充実してる、特にTeX関連、学振DCとかPDの申請書類作成時にはお世話になっております)

英語論文執筆用の例文検索サービス
(とんでもないものを見つけてしまった・・・・ arXivに収録されている 811,761報の 英語論文から,例文を検索するための検索エンジン)


Template "simple02" by Emile*Emilie
忍者ブログ [PR]