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

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

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

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

Python

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

Q&A

解決済

2回答

2761閲覧

Python 条件により新しい要素を追加する

unser

総合スコア58

CSV

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

Python

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

0グッド

0クリップ

投稿2020/02/19 02:42

編集2020/02/19 02:50

前提・実現したいこと

Pythonにてcsvファイルを取り込み新しい要素を追加し、ある条件に当てはまるならその要素を追加する物を作成しています。

具体的に言うと、曲のリリースの時期に合わせて該当するアルバムタイトルをつけるようなものです。

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

Traceback (most recent call last):
File "album_uver.py", line 11, in <module>
row.album = 'Timeless'
AttributeError: can't set attribute

該当のソースコード

Python

1import csv 2import pandas as pd 3 4df = pd.read_csv('list.csv',encoding='cp932') 5 6 7df['album'] = '' 8 9for row in df.itertuples(): 10 if(row.release <= 20060215): 11 row.album = 'Timeless' 12 print(row.album) 13 14

###確認したこと
dir(row)=['Index', '_1', 'add', 'class', 'contains', 'delattr', 'dir', 'doc', 'eq', 'format', 'ge', 'getattribute', 'getitem', 'getnewargs', 'gt', 'hash', 'init', 'init_subclass', 'iter', 'le', 'len', 'lt', 'module', 'mul', 'ne', 'new', 'reduce', 'reduce_ex', 'repr', 'rmul', 'setattr', 'sizeof', 'slots', 'str', 'subclasshook', '_asdict', '_field_defaults', '_fields', '_fields_defaults', '_make', '_replace', 'album', 'count', 'index', 'lyrics', 'release', 'title']
のため、albumは属性に含まれると思うのですが。。。

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

読み込むcsvファイルは以下のようなものです。
||title|release|lyrics|
|:--|:--:|--:|
|0|AAA|20050706|not too late
|0|BBB|20190707|it's a piece of cake

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

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

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

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

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

guest

回答2

0

papinianusさんが書かれているように、rowは tuple なので書き換えできません。

条件に応じて 元のDataFrameを書き換えたいというのであれば itertuples() から得られた row を書き換えるのではなく、元のDataFrameを書き換え るとよいかと思います。

Python

1import pandas as pd 2 3df = pd.read_csv('list.csv',encoding='cp932') 4 5df['album'] = '' 6 7for row in df.itertuples(): 8 if(row.release <= 20060215): 9 df.loc[row.Index, 'album'] = 'Timeless' 10print(df)

この処理はループを使わずに、条件でフィルタリングを行って

Python

1df.loc[df.release <= 20060215, 'album'] = 'Timeless'

と書くこともできます。

投稿2020/02/19 04:49

magichan

総合スコア15898

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

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

unser

2020/02/21 23:01

ありがとうございます!
guest

0

ベストアンサー

album がない、ではなくタプルだから代入できないのでは?

解決策の例として下記を発見しました。
pythonでfor文の中で値の代入更新ができない

投稿2020/02/19 03:32

papinianus

総合スコア12705

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

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

unser

2020/02/21 23:00

ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問