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

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

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

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

Q&A

解決済

2回答

1446閲覧

appendの高速化

midsum0323

総合スコア40

Python 3.x

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

0グッド

0クリップ

投稿2018/04/02 01:26

編集2018/04/11 04:28

前提・実現したいこと

あるデータをforで並び替えて一行のレコードに変換して、出力用のデータフレームに追加したいと考えています。現在、pandas.DataFrameでs出力用のデータフレームを作成し、for文のなかで追加用のseriesをつくり、appendで上記のDataFrameにSeriesを追加するようにしているのですが、処理速度が遅く困っております。どうすれば高速化できるかアイデア等ご教授頂けるとありがたいです。

該当のソースコード

import pandas as pd f=pd.DataFrame([1,2,3],[4,5,6]) df= pd.DataFrame(index=[’ 'A','B']) for idx,row in f.itrrows():   S=pd.Series(index=['A','B'])   S['A']=row[1]   S['B']=row[2]   df=df.append(S,ignore_index=True)

※実際のデータのイメージ
元データ
|列1|列2|列3|列4|
|:--|:--:|--
|A|B1|C|D|
| |B2| |E|


|列1|列2|列3|列4|列5|
|:--|:--:|--:|
|A|B1 B2|C|D|E|

に成型する

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

Python3.6

ここにより詳細な情報を記載してください。

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

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

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

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

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

midsum0323

2018/04/02 01:36

該当のソースコード内のfor文内のインデントがうまく下がりません。下4行がfor内です。
Udomomo

2018/04/02 04:13

```でコードを囲むと、インデントがうまく下がります。
midsum0323

2018/04/02 04:22

ありがとうございます。修正できました
guest

回答2

0

ベストアンサー

質問のコードは、特にループを使わなくても

Python

1import pandas as pd 2 3f = pd.DataFrame([[1,2,3],[4,5,6]]) 4df = f.iloc[:, [1,2]].rename(columns={1:'a', 2:'b'}) 5print(df)

で十分な気がするのですが、(これでかなり速くなります)
なにかループを使わなければならない理由があるのでしょうか?


【補足】
Loopを使う場合を記述

Python

1import pandas as pd 2f = pd.DataFrame([[1,2,3],[4,5,6]]) 3rows = [] 4for idx, row in f.iterrows(): 5 rows.append(row[[1,2]]) 6df = pd.concat(rows, axis=1).T.rename(columns={1:'A', 2:'B'}) 7print(df)

【更に補足】
とりあえず質問の処理をループを使わずに書いてみました。
現在、どのような処理を行っているのか不明ですが、ループを行うよりは高速に処理できるはずです。

Python

1import pandas as pd 2 3df = pd.DataFrame([['A0','B0','C0','D0'], 4 [np.nan,'B1',np.nan,'D1'], 5 ['A2','B2','C2','D2'], 6 [np.nan,'B3',np.nan,'D3'], 7 ['A4','B4','C4','D4'], 8 [np.nan,'B5',np.nan,'D5']]) 9 10print(df) 11# 0 1 2 3 12#0 A0 B0 C0 D0 13#1 NaN B1 NaN D1 14#2 A2 B2 C2 D2 15#3 NaN B3 NaN D3 16#4 A4 B4 C4 D4 17#5 NaN B5 NaN D5 18 19df[4] = df[3].shift(-1) 20df[1] = df[1].str.cat(df[1].shift(-1), sep=' ') 21 22print(df[0::2]) 23# 0 1 2 3 4 24#0 A0 B0 B1 C0 D0 D1 25#2 A2 B2 B3 C2 D2 D3 26#4 A4 B4 B5 C4 D4 D5

投稿2018/04/02 05:24

編集2018/04/11 05:14
magichan

総合スコア15898

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

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

midsum0323

2018/04/02 05:41

ご回答ありがとうございます! 実際の処理はもっと複雑で元のデータの3行程度を1行にまとめる処理をしています。 ですのでできればループで処理をしたいです。
magichan

2018/04/02 06:26

なるほど、そういう事なのですね とりあえず、concatを使うサンプルを追記しました。 データが(メモリーを圧迫するほど)巨大でなければこちらの方が早い かと思います。 コメントに > 実際の処理はもっと複雑で元のデータの3行程度を1行にまとめる処理 とありますが、この部分を(簡単でもよいので)具体的に - どのような形式のデータを - どのような処理を施して - どのような形式のデータに変換したい の記載をしていただけたら、もう少し具体的に回等が出来るかと思います。
midsum0323

2018/04/11 04:21

風邪でぶっ倒れていて返事が遅くなりました。申し訳ございません。 実際のデータ例を追記しました。 よろしくお願いいたします。
magichan

2018/04/11 05:15

仕様を完全に理解しているかが不明ですが、とりあえずループを使わない方法にて処理を行う方法を記述しました。
midsum0323

2018/04/11 05:27

ありがとうございます!かなり早くなりました!助かりました。
guest

0

すぐ思いつくのは、

  • リストや辞書で作って最後にどひゃっとDataFrameに変換する
  • そもそも並び替えたいだけならsort_valuesなどを使って頑張る

並び替えの要件がよくわかりませんが、そこ次第ではpandasの機能だけで作れるかもしれないし、速いやり方もあるはずです。

投稿2018/04/02 05:13

hayataka2049

総合スコア30933

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

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

midsum0323

2018/04/02 05:52

ありがとうございます。実際の処理では、元データの複数行を1行にまとめる処理を行っており、各要素もすべて埋まるとは限らない状況です。辞書は試してみます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問