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

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

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

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

Q&A

解決済

2回答

1343閲覧

PythonでPandasのfor文

gymgym

総合スコア97

Python

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

0グッド

0クリップ

投稿2017/12/06 03:53

編集2017/12/06 03:54

Python

1import pandas as pd 2import numpy as np 3 4mydata01 = pd.read_csv("a01.csv", index_col=None, header=None) 5mydata02 = pd.read_csv("a02.csv", index_col=None, header=None) 6a01,a02,a03,a04,a05,a06,a07,a08,a09,a10,a11,a12,a13,a14,a15=[[] for i in range(15)] 7a_1 = [a01,a02,a03,a04,a05,a06,a07,a08,a09] 8a_num1 = [4260, 6067, 7829, 10965, 12774, 14535, 18075, 19836,21597] 9a_2 = [a10,a11,a12,a13,a14,a15] 10a_num2 = [3071, 4836, 6498, 9886, 11731, 13409] 11 12aso01,aso02,aso03,aso04,aso05,aso06,aso07,aso08,aso09 = [i.extend(mydata01.iloc[j-62:j+625,0]) for i,j in zip(a_1,a_num1)] 13print(aso01)

以上のコードを実行すると、Noneになります

extendがいけないのでしょうか

よろしくお願いいたします

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

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

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

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

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

guest

回答2

0

ベストアンサー

やりたいことというのは以下のシンプルのものではないでしょうか。

python

1a_num1 = [4260, 6067, 7829, 10965, 12774, 14535, 18075, 19836,21597] 2 3aso01, aso02, aso03, aso04, aso05, aso06, aso07, aso08, aso09 = [mydata01.iloc[j-62:j+625, 0] for i in a_num1]

valuesとtolist()の型について
それぞれpandas.DataFramenumpy.arraylistと型が異なります。
その為、その後にコールできるメソッドも異なります。

python

1import pandas as pd 2a = pd.DataFrame() 3a['a'] = ['a'] 4print(type(a.iloc[:, :])) 5#<class 'pandas.core.frame.DataFrame'> 6print(type(a.iloc[:, :].values)) 7#<class 'numpy.ndarray'> 8print(type(a.iloc[:, :].values.tolist())) 9#<class 'list'>

valuesとtolist()の挙動について
渡されているものに対して変更を行った場合の振る舞いが異なります。
副作用の出るような振る舞いはpythonでは基本的に好ましくありません。
どうしても必要な場合もありますが、往々にしてもっとわかりやすく記述する方法があります。

python

1import pandas as pd 2 3a = pd.DataFrame() 4a['a'] = ['a'] 5b = a.iloc[:, :].values.tolist() 6print(a) 7#データフレームaを確認します。 8''' 9 a 100 a 11''' 12#bはリストとして振る舞います。 13b[0][0] = 'b' 14print(a) 15#.tolist()をしてコピーされたので、bを操作してもデータフレームaに変更はありません。 16''' 17 a 180 a 19''' 20 21b = a.iloc[:, :].values 22print(a) 23#再び確認 24''' 25 a 260 a 27''' 28b[0][0] = 'b' 29print(a) 30#aの中のポインターとして渡されているので、bを変えるとデータフレームaも変更されています。 31''' 32 a 330 b 34'''

特にこれらが正しいというわけではありませんが、副作用とか関数型プログラミングのキーワードとしての読み物をいくつか。
http://bugrammer.hateblo.jp/entry/2015/08/11/231617
https://news.mynavi.jp/article/python-18/
https://qiita.com/kwatch/items/03fd035a955235681577

投稿2017/12/06 04:33

編集2017/12/08 03:28
mkgrei

総合スコア8560

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

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

magichan

2017/12/06 05:36

たぶん、やりたいことはこうゆう事なんでしょうね・・・。 ただ、欲しているのは DataFrameのViewではなくてリストっぽいので、この場合は tolist() か values をつけた方が良いのかもしれません。 まあ、質問者さんが何をやりたいかによるのですが。
mkgrei

2017/12/06 05:39

確かにtolist()があったほうが安心ですね。 ilocとvaluesだとポインタを渡していることになるので、aso01とかで変更するとmydata01にも反映されてしまいますね。
gymgym

2017/12/08 03:05

tolist()はどこに加えたらよいでしょうか。 また、加えることでのメリットを教えていただけたらありがたいです。
mkgrei

2017/12/08 03:31

追記しました。 tolist()を加えると、aso01の中身を変更した時にmydata01に変更が反映されるのを回避できるメリットがあります。 という記述には語弊があるので、正しく言い換えるなら、aso01がまさにmydata01の中身になってしまうことを防いてくれます。
gymgym

2017/12/08 07:06

丁寧に回答していただきありがとうございます。 とても参考になりました!
guest

0

extendがいけないのでしょうか

はい。そのとおりです。
extend() は破壊的メソッドなので、戻り値は None です。
その代わり a01 のリストの内容が更新されているのではないでしょうか。

投稿2017/12/06 04:20

magichan

総合スコア15898

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問