質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

1846閲覧

python pandasのdf.loc[]へ代入するとエラーが出る

oyatsu8

総合スコア97

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2023/01/30 02:17

編集2023/01/30 03:46

やりたいこと

PythonでCSVを読み込み、読み込んだCSVの行をfor文で回し、
indexの次の番号の変数を作って(現在indexが1なら次のindex 2)とカラム名を指定して代入したいので、df.loc[変数,列名]で出来ないかと思い、実行したところ、次のようなエラーが出ました。(特定の列を次の列のものにずらしたい)。このコードだとindexが5(無いindex)まで指定してしまうのでエラーが出るのかと思い修正しましたが、エラーは消えませんでした。これは一体なんなのか教えていただけたら幸いです。

発生している問題・エラーメッセージ

raise KeyError(key) from err KeyError: 4

該当のソースコード

python(test.py)

1import pandas as pd 2import csv 3 4df = pd.read_csv('test.csv',encoding='utf_8') 5data = [] 6index_next = 0 7 8for index,row in df.iterrows():#1行ずつ呼び出す 9 print("index:",index) 10 index_next = index+1#indexに1を足したもの 11 12 if index_next < len(df.index): 13 print("index_next:",index_next) 14 print("row:",row) 15 16 index_column = df.loc[index_next, "gram"]#今処理している行の次の行のカラム"gram"を抽出したい 17 print(index_column)

test.csv

1name,gram,test 2Akiko,300g,1 3Ken,200g,2 4Taro,500g,3 5Keiko,800g,4

試したこと

index_nextでなく、indexをそのまま入れた場合
index_column = df.loc[index, "gram"]や、
数値をそのまま入れた場合
index_column = df.loc[2, "gram"]はエラーは出ませんでした。
またtypeで型を出すと、indexもindex_nextもint型でした。

補足情報(FW/ツールのバージョンなど)

ライブラリ:pandas,csv
環境:Python3.8.9 MacOS 12.3.1、ターミナルで実行

pythonやpandasを使い始めて間もないため色々理解しきれていませんが、アドバイスいただけると助かります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

melian

2023/01/30 02:24

データフレームは4行なので、インデックスは 0 から 3 になります。
melian

2023/01/30 02:47

index_next = index + 1 の位置が違うので、以下の様にします。 for index,row in df.iterrows():#1行ずつ呼び出す  print("index:",index)  index_next = index+1#indexに1を足したもの  if index_next < len(df.index):   print("index_next:",index_next)
oyatsu8

2023/01/30 03:22

ありがとうございます。修正してみます。 回答でないのでmelianさんの評価ができないのですが、お忙しいと思いますが、回答側に書いてもらえないでしょうか
melian

2023/01/30 03:36 編集

回答へ転記しました。oyatsu8 さんが期待する最終的な結果(データフレームかリストでしょうか)は具体的にはどの様なものなのでしょう?
oyatsu8

2023/01/30 03:54

ありがとうございます。最終的にはjsonで書き出したいと思っています。このような形にしたいです。 [{"name":"Akiko","gram":"300g","test":2}, {"name":"Akiko","gram":"200g","test":3}, {"name":"Akiko","gram":"50g","test":4}, {"name":"Akiko","gram":"800g","test":none}]
melian

2023/01/30 04:26

回答に追記しました。参考にしてみて下さい。
jbpb0

2023/01/30 04:46

> うまくいきました。 質問を「解決済」にしてください
guest

回答1

0

ベストアンサー

※ コメント欄から転記

index_next = index + 1 の位置が違いますので、以下の様に変更します。

python

1for index,row in df.iterrows():#1行ずつ呼び出す 2 print("index:",index) 3 index_next = index+1#indexに1を足したもの 4 if index_next < len(df.index): 5 print("index_next:",index_next)

追記

最終的にはjsonで書き出したいと思っています。このような形にしたいです。

JSON への書き出しには pandas.DataFrame.to_json — pandas 1.5.3 documentation というメソッドを利用することができます。ただ、ドキュメントにも書かれていますが、NaNNonenull に置き換えられます。

python

1import pandas as pd 2 3df = pd.read_csv('test.csv',encoding='utf_8') 4 5# test 列を上書き 6df['test'] = df.index + 2 7# test 列の最終行に None(NaN) を入れる 8df.loc[len(df)-1, 'test'] = None 9# データフレームをJSON フォーマットな文字列に変換 10json_data = df.to_json(orient='records', double_precision=0) 11 12print(json_data) 13 14# [{"name":"Akiko","gram":"300g","test":2}, 15# {"name":"Ken","gram":"200g","test":3}, 16# {"name":"Taro","gram":"500g","test":4}, 17# {"name":"Keiko","gram":"800g","test":null}]

投稿2023/01/30 03:34

編集2023/01/30 04:33
melian

総合スコア19761

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

oyatsu8

2023/01/30 03:47

melian様、ありがとうございます。うまくいきました。 ループ処理をするときにいつも頭がこんがらがってしまい、、助かりました。
oyatsu8

2023/01/30 05:04

JSON への書き出しまで教えてくださりありがとうございます。このような書き方ができるんですね、とても参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問