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

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

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

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

1392閲覧

pythonでpandasを使用し、csvファイルの列の内容を読み取り、それに応じた値を格納した列を新しく追加したい

_nyanco_

総合スコア1

CSV

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2020/10/08 05:27

編集2020/10/08 09:14

前提・実現したいこと

csvファイルからデータを取得し、csvファイルの中を読み取り、その内容に新たな値を追加した列を追加したいです。
以下のようなcsvファイルがあります。

product type Product-date
daifuku wet 2020-10-07
senbei dry 2020-9-29
...
monaka wet 2020-09-23
dango wet 2020-10-01
okaki dry 2020-10-02

新たに消費期限(limit-date)という列を作成し、
このtypeがdryだった場合は、product-dateに二週間追加した値を、
wetだった場合には1週間追加した値を格納したいです。
また、csvファイルはデータ量が多く、1万行ほどあります。

実現したいこと
product type Product-date limit-date
daifuku wet 2020-10-07 2020-10-14
senbei dry 2020-09-29 2020-10-13
...
monaka wet 2020-09-23 2020-09-30
dango wet 2020-10-01 2020-10-08
okaki dry 2020-10-02 2020-10-16

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

sys: file.py:11;SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy df['limit-date'][index] = '-'

該当のソースコード

python

1import csv 2import datetime 3import pandas as pd 4 5try: 6 df = pd.read_csv(file) 7 df= df.assign(limit-date = 0) 8 9 for index, row in df.terrows(): 10 if df['type'][index] != 'wet' or df['type'][index] != 'dry': 11 df['limit-date'][index] = '-' 12 else : 13 if df['type'][index] = 'wet': 14 df['limit-date'][index] = datetime.datetime.strptime(df['product-date'][index])+ datetime.timedelta(days = 7) 15 elif df['type'] != 'dry' : 16 df['limit-date'][index] = datetime.datetime.strptime(df['product-date'][index])+ datetime.timedelta(days = 14) 17 18 df.to_csv('to_csv_out_a.csv', mode='w')

試したこと

書き換えて試しましたが、不明です。
また、上記エラー文を吐いて固まります。

プログラミング初心者でpandasも初めて使用するため、
DateFrameについても、全体的についても理解が足りず、試行錯誤してますorz。

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

python 3.5
pandas 1.1.3

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

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

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

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

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

meg_

2020/10/08 07:45

「発生している問題」はエラーですか?エラーの種類も不明ですし、エラー発生箇所も不明です。他にもエラーメッセージがあれば全文掲載してください。
_nyanco_

2020/10/08 08:11

失礼しました、エラー文が一文が抜けていたので追記しました。 このエラー文のみ表示され、固まるのでこれ以上何が起こっているのか不明な状態です。。。
guest

回答1

0

ベストアンサー

説明のために直接コードに書いたCSVデータを読み込む処理を書いていますので、その部分はあなたのコードではCSVファイルを読み込むように書き換えてください。

  • read_csvでCSVファイルを読み込む。その際、parse_datesを指定することで、Product-dateの値がdatetime64値になる。文字列のままだと、統一されていない書き方で問題が起こるかもしれない(月の9と09など)
  • データフレームにlimit-dateの列を追加する。assigninsertを使ってもいいが、末尾に追加するだけなら、df['limit-date'] = pd.NaTが簡単。pd.natは、pandasに用意された日時用の欠損値(Not a Time)
  • typeの値に応じて、limit-dateの列の値を更新する。locを使って条件に合う行のtime-limitの列だけを書き換えている。詳細は以下のリンク先の記事を参照。

pandasで条件に応じて値を代入(where, mask) | note.nkmk.me

Python

1import pandas as pd 2import io 3import datetime 4 5txt = """ 6product,type,Product-date 7daifuku,wet,2020-10-07 8senbei,dry,2020-9-29 9nyanko,,2020-02-22 10monaka,wet,2020-09-23 11dango,wet,2020-10-01 12okaki,dry,2020-10-02 13""" 14 15df = pd.read_csv(io.StringIO(txt), parse_dates=['Product-date']) 16# print(df) 17 18df['limit-date'] = pd.NaT 19# print(df) 20 21df.loc[df['type'] == 'wet', 'limit-date'] = df['Product-date'] + datetime.timedelta(days=7) 22df.loc[df['type'] == 'dry', 'limit-date'] = df['Product-date'] + datetime.timedelta(days=14) 23print(df)

result

1 product type Product-date limit-date 20 daifuku wet 2020-10-07 2020-10-14 31 senbei dry 2020-09-29 2020-10-13 42 nyanko NaN 2020-02-22 NaT 53 monaka wet 2020-09-23 2020-09-30 64 dango wet 2020-10-01 2020-10-08 75 okaki dry 2020-10-02 2020-10-16

投稿2020/10/08 07:51

編集2020/10/08 08:06
Daregada

総合スコア11990

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

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

_nyanco_

2020/10/09 02:11

出来ました!!ありがとうございます。 恥ずかしながら、locを知らず、勉強になりました。 また、他の箇所についてもコメントありがとうございます。 大変参考になります。 自分のコードの甘さが気になり、、、もっと勉強しようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問