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

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

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

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

pandas

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

Q&A

解決済

2回答

762閲覧

(python)(pandas)複数のfor文を一つにまとめる方法

tanak.aaaaa

総合スコア6

Python

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

pandas

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

0グッド

0クリップ

投稿2021/08/08 03:40

編集2021/08/09 09:02

下記のdf(df名:test)から条件を付けてデータの抽出を行うために下記のようなfor文とif文を組み合わせたものを作成いたしました。
しかしたった一つしかパラメータが違わない
(今回の場合は if test.loc[i, "close"]>test.loc[i, "変数"]:)
のにも関わらず複数回同じコードを使用するのは非効率だと思っており、一本のコードで複数のdfにデータを抽出する術を模索しております。

またご覧いただいたらわかっていただける通り初心者のコードですので非効率的な方法でやっていると思います。
もしほかのコードで同じことが出来る様なものがありましたらそちらを上記の質問に加えてお教え頂ければ幸いです。
よろしくお願いいたします。

condition1 = pd.DataFrame(index=[], columns=["date1", "close1", "date2", "close2"]) condition2 = pd.DataFrame(index=[], columns=["date1", "close1", "date2", "close2"]) condition3 = pd.DataFrame(index=[], columns=["date1", "close1", "date2", "close2"]) for i in range(len(test)): if test.loc[i, "close"]>test.loc[i, "open"]: a= pd.Series(data=[test.loc[i, "Date"], test.loc[i, "close"], test.loc[i+1, "Date"], test.loc[i+1, "close"]], index=condition1.columns) condition1 = condition1.append(a, ignore_index=True) if test.loc[i+1, "Date"] == "2021年4月30日": break for i in range(len(test)): a= pd.Series(data=[test.loc[i, "Date"], test.loc[i, "close"], test.loc[i+1, "Date"], test.loc[i+1, "close"]], index=condition2.columns) if test.loc[i, "close"]>test.loc[i, "high"]: condition2 = condition2.append(a, ignore_index=True) if test.loc[i+1, "Date"] == "2021年4月30日": break for i in range(len(test)): a= pd.Series(data=[test.loc[i, "Date"], test.loc[i, "close"], test.loc[i+1, "Date"], test.loc[i+1, "close"]], index=condition3.columns) if test.loc[i, "close"]>test.loc[i, "low"]: condition3 = condition3.append(a, ignore_index=True) if test.loc[i+1, "Date"] == "2021年4月30日": break print(condition1)

condition1の取得結果
date1 close1 date2 close2
0 2021年7月28日 40003.2 2021年7月27日 39452.0
1 2021年7月27日 39452.0 2021年7月26日 37276.6
2 2021年7月26日 37276.6 2021年7月25日 35391.1
3 2021年7月25日 35391.1 2021年7月24日 33824.8
4 2021年7月24日 33824.8 2021年7月23日 33603.3
5 2021年7月23日 33603.3 2021年7月22日 32298.9
6 2021年7月22日 32298.9 2021年7月21日 32131.4
7 2021年7月21日 32131.4 2021年7月20日 29793.8
8 2021年7月18日 31785.4 2021年7月17日 31518.6
9 2021年7月17日 31518.6 2021年7月16日 31394.0
10 2021年7月14日 32820.7 2021年7月13日 32728.1
11 2021年7月11日 34227.7 2021年7月10日 33510.6
12 2021年7月9日 33797.4 2021年7月8日 32866.3
13 2021年7月6日 34225.6 2021年7月5日 33687.8
14 2021年7月4日 35298.2 2021年7月3日 34742.8
15 2021年7月3日 34742.8 2021年7月2日 33813.4
16 2021年7月2日 33813.4 2021年7月1日 33543.6
17 2021年6月29日 35834.7 2021年6月28日 34475.9
18 2021年6月27日 34678.5 2021年6月26日 32243.4
19 2021年6月26日 32243.4 2021年6月25日 31594.0
20 2021年6月24日 34665.8 2021年6月23日 33674.3
21 2021年6月23日 33674.3 2021年6月22日 32496.4
22 2021年6月22日 32496.4 2021年6月21日 31692.0
23 2021年6月20日 35595.8 2021年6月19日 35513.4
24 2021年6月14日 40529.4 2021年6月13日 39022.9
25 2021年6月13日 39022.9 2021年6月12日 35467.5
26 2021年6月11日 37314.6 2021年6月10日 36649.4
27 2021年6月9日 37332.2 2021年6月8日 33382.9
28 2021年6月6日 35815.4 2021年6月5日 35520.0
29 2021年6月3日 39187.3 2021年6月2日 37555.8
30 2021年6月2日 37555.8 2021年6月1日 36687.6
31 2021年5月31日 37298.6 2021年5月30日 35652.8
32 2021年5月30日 35652.8 2021年5月29日 34584.6
33 2021年5月26日 39249.2 2021年5月25日 38378.3
34 2021年5月24日 38750.6 2021年5月23日 34679.7
35 2021年5月22日 37448.3 2021年5月21日 37297.4
36 2021年5月20日 40717.2 2021年5月19日 36720.5
37 2021年5月14日 49839.8 2021年5月13日 49704.6
38 2021年5月13日 49704.6 2021年5月12日 49384.2
39 2021年5月11日 56695.7 2021年5月10日 55848.9
40 2021年5月8日 58840.1 2021年5月7日 57337.2
41 2021年5月7日 57337.2 2021年5月6日 56405.4
42 2021年5月5日 57441.3 2021年5月4日 53741.5
43 2021年5月3日 57169.8 2021年5月2日 56603.8
44 2021年5月1日 57807.1 2021年4月30日 57720.3

今回使用しているデータフレーム"test"
Date close open high low
0 2021年7月30日 38997.4 40001.1 40245.6 38915.2
1 2021年7月29日 40001.4 40009.0 40630.7 39340.8
2 2021年7月28日 40003.2 39450.4 40862.2 38883.8
3 2021年7月27日 39452.0 37294.3 39455.9 36427.4
4 2021年7月26日 37276.6 35392.3 40522.9 35236.7
5 2021年7月25日 35391.1 34392.5 35391.1 33881.3
6 2021年7月24日 33824.8 33600.5 33955.0 33412.9
7 2021年7月23日 33603.3 32297.9 33605.6 32041.1
8 2021年7月22日 32298.9 32131.7 32585.4 31729.4
9 2021年7月21日 32131.4 29794.7 32794.6 29519.3
10 2021年7月20日 29793.8 30835.4 31040.8 29310.2
11 2021年7月19日 30837.2 31782.9 31887.0 30478.2
12 2021年7月18日 31785.4 31517.9 32408.2 31220.6
13 2021年7月17日 31518.6 31384.4 31914.8 31207.8
14 2021年7月16日 31394.0 31842.3 32239.8 31062.2
15 2021年7月15日 31840.5 32820.5 33157.0 31175.8
16 2021年7月14日 32820.7 32727.8 33051.9 31611.2
17 2021年7月13日 32728.1 33106.1 33307.7 32259.5
18 2021年7月12日 33113.0 34228.3 34598.0 32662.8
19 2021年7月11日 34227.7 33510.8 34580.6 33319.8
20 2021年7月10日 33510.6 33797.7 34221.0 33056.8
21 2021年7月9日 33797.4 32866.3 34079.2 32367.0
22 2021年7月8日 32866.3 33859.4 33923.2 32146.9
23 2021年7月7日 33867.8 34228.7 35036.6 33801.3
24 2021年7月6日 34225.6 33688.5 35062.0 33581.7
25 2021年7月5日 33687.8 35297.0 35300.5 33164.1
26 2021年7月4日 35298.2 34742.8 35957.6 34740.1
27 2021年7月3日 34742.8 33814.2 34909.8 33363.3
28 2021年7月2日 33813.4 33542.2 33925.9 32734.6
29 2021年7月1日 33543.6 35030.7 35032.7 32839.2
30 2021年6月30日 35026.9 35832.6 36089.5 34126.6
31 2021年6月29日 35834.7 34477.3 36590.3 34247.6
32 2021年6月28日 34475.9 34682.2 35231.2 33944.9
33 2021年6月27日 34678.5 32247.1 34685.5 32041.7
34 2021年6月26日 32243.4 31592.1 32643.0 30206.9
35 2021年6月25日 31594.0 34660.5 35490.9 31337.9
36 2021年6月24日 34665.8 33678.1 35249.9 32356.7
37 2021年6月23日 33674.3 32498.3 34784.3 31736.5
38 2021年6月22日 32496.4 31682.7 33272.5 28901.8
39 2021年6月21日 31692.0 35597.9 35708.4 31284.1
40 2021年6月20日 35595.8 35510.9 36097.9 33378.0
41 2021年6月19日 35513.4 35770.0 36357.3 34845.5
42 2021年6月18日 35749.4 38045.5 38166.0 35198.5
43 2021年6月17日 38052.0 38337.8 39529.9 37425.3
44 2021年6月16日 38336.0 40148.1 40494.4 38156.4
45 2021年6月15日 40156.1 40522.5 41318.0 39589.9
46 2021年6月14日 40529.4 39024.1 40970.4 38769.9
47 2021年6月13日 39022.9 35467.5 39321.6 34827.0
48 2021年6月12日 35467.5 37334.4 37437.3 34703.3
49 2021年6月11日 37314.6 36654.3 37641.1 36003.3
50 2021年6月10日 36649.4 37375.2 38340.8 35824.0
51 2021年6月9日 37332.2 33385.5 37517.6 32428.6
52 2021年6月8日 33382.9 33574.6 34047.8 31158.1
53 2021年6月7日 33578.0 35815.4 36754.6 33410.1
54 2021年6月6日 35815.4 35518.7 36434.0 35265.3
55 2021年6月5日 35520.0 36841.2 37887.6 34832.0
56 2021年6月4日 36851.3 39191.4 39255.4 35659.9
57 2021年6月3日 39187.3 37555.7 39462.3 37193.6
58 2021年6月2日 37555.8 36687.7 38199.9 35981.1
59 2021年6月1日 36687.6 37294.3 37850.3 35742.7
60 2021年5月31日 37298.6 35644.0 37480.7 34213.2
61 2021年5月30日 35652.8 34589.3 36388.6 33441.0
62 2021年5月29日 34584.6 35664.5 37227.1 33664.2
63 2021年5月28日 35662.5 38543.2 38844.1 34772.4
64 2021年5月27日 38417.3 39249.0 40322.2 37190.8
65 2021年5月26日 39249.2 38375.7 40750.0 37847.0
66 2021年5月25日 38378.3 38753.6 39740.8 36540.7
67 2021年5月24日 38750.6 34720.3 39851.7 34474.6
68 2021年5月23日 34679.7 37446.8 38248.7 31192.4
69 2021年5月22日 37448.3 37291.0 38776.0 35314.9
70 2021年5月21日 37297.4 40611.2 42108.3 33592.3
71 2021年5月20日 40717.2 36706.8 42425.9 35010.4
72 2021年5月19日 36720.5 42898.3 43516.6 30261.7
73 2021年5月18日 42897.3 43538.5 45770.9 42293.9
74 2021年5月17日 43541.3 46424.2 46545.4 42201.5
75 2021年5月16日 46426.4 46729.3 49764.3 43920.8
76 2021年5月15日 46708.8 49839.1 50640.9 46650.2
77 2021年5月14日 49839.8 49704.9 51459.2 48874.0
78 2021年5月13日 49704.6 49398.2 51337.3 46331.1
79 2021年5月12日 49384.2 56694.5 57938.5 49187.0
80 2021年5月11日 56695.7 55846.1 56871.1 54550.4
81 2021年5月10日 55848.9 58251.2 59523.9 53678.3
82 2021年5月9日 58238.3 58840.6 59227.0 56414.4
83 2021年5月8日 58840.1 57330.3 59471.1 56972.2
84 2021年5月7日 57337.2 56411.4 58639.3 55300.1
85 2021年5月6日 56405.4 57441.0 58364.9 55294.5
86 2021年5月5日 57441.3 53872.5 57936.4 53872.5
87 2021年5月4日 53741.5 57170.6 57201.3 53741.5
88 2021年5月3日 57169.8 56605.8 58925.1 56562.4
89 2021年5月2日 56603.8 57807.2 57868.4 56110.5
90 2021年5月1日 57807.1 57719.1 58449.4 57029.5
91 2021年4月30日 57720.3 53562.3 57925.6 53088.7

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

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

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

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

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

meg_

2021/08/08 03:43

・サンプルデータをテキストで提示していただきたいです。(画像ですとコピペ出来ません) ・結果のサンプルデータも提示していただきたいです。
tanak.aaaaa

2021/08/08 03:44

ありがとうございます。 ただいま修正させていただきます
ppaul

2021/08/08 04:32

NameError: name 'empty' is not defined でエラーになります。
tanak.aaaaa

2021/08/09 08:59

ppaulさんコメントありがとうございます。 質問用にコードを書き直していたら修正し忘れていました、大変失礼しました。 修正いたします
guest

回答2

0

ベストアンサー

以下です。

python

1test2 = pd.concat([test[['Date', 'close']].rename(columns={'Date':'date1', 'close':'close1'}), 2 test[['Date', 'close']].shift(-1).rename(columns={'Date':'date2', 'close':'close2'})], axis=1) 3 4condition = {c : test2[test['close'] > test[c]].dropna() for c in ["open", "high", "low"]}

結果は、condition['open']、condition['high']、condition['low']に入っています。

実行結果の一部

python

1>>> print(condition['open'].head(10)) 2 date1 close1 date2 close2 32 202172840003.2 202172739452.0 43 202172739452.0 202172637276.6 54 202172637276.6 202172535391.1 65 202172535391.1 202172433824.8 76 202172433824.8 202172333603.3 87 202172333603.3 202172232298.9 98 202172232298.9 202172132131.4 109 202172132131.4 202172029793.8 1112 202171831785.4 202171731518.6 1213 202171731518.6 202171631394.0 13

投稿2021/08/08 07:27

ppaul

総合スコア24666

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

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

tanak.aaaaa

2021/08/10 02:10 編集

回答ありがとうございます。 こんなに簡潔にまとめ上げていただけて大変感謝しております。 concatをこのような形で使えるとは思ってもおらず。大変勉強になりました。 差し支えなければ一つお教えいただきたいのですが、{c : は何という関数なのでしょうか? また test['close'] > test[c] のcloseもcと同じ内容の変数にしたい場合はどのようにするべきなのでしょうか? 後学のためにお教えいただけると大変助かります。
ppaul

2021/08/10 03:33

{c : は何という関数なのでしょうか? 辞書内包表記といいます。 https://docs.python.org/ja/3.7/reference/expressions.html#dictionary-displays https://docs.python.org/ja/3/tutorial/datastructures.html#list-comprehensions を見てください。 test['close'] > test[c] のcloseもcと同じ内容の変数にしたい場合はどのようにするべきなのでしょうか? 質問の意味が良くわかりません。test[c] > test[c]ということを聞いているのではないですよね。
tanak.aaaaa

2021/08/10 03:41

回答ありがとうございます。 リンクをお送りいただきありがとうございます、勉強させていただきます。 質問の内容が分かりにくくなってしまい申し訳ありません。 仰る通りtest[c] > test[c]ではなく、test[a] > test[c]にしてa, c両方に["open", "high", "low"]が入ってすべての組み合わせを試す、みたいなことがしたいのですが for a, c in ["open", "high", "low"]にするとエラーが発生するのでどのようにするべきかお教えいただければなと思いコメントいたしました。
tanak.aaaaa

2021/08/10 05:42

Ppaulさん 何度も返信いただきありがとうございます!
guest

0

python

1for i in range(len(test)): 2 if test.loc[i, "close"]>test.loc[i, "open"]: 3 a= pd.Series(data=[test.loc[i, "Date"], test.loc[i, "close"], test.loc[i+1, "Date"], test.loc[i+1, "close"]], index=empty.columns) 4 condition1 = condition1.append(a, ignore_index=True)

上記コードをforループを使わない方法に変えてみました。
※変数名は置き換えています。

Python

1df2 = df.loc[df['close'] > df['open']].copy() 2df2['Date2'] = df.loc[df['close'] > df['open']].shift(-1)['Date'] 3df2['close2'] = df.loc[df['close'] > df['open']].shift(-1)['close'] 4print(df) 5# Date close open high low Date2 close2 6#2 2021年7月28日 40003.2 39450.4 40862.2 38883.8 2021年7月27日 39452.0 7#3 2021年7月27日 39452.0 37294.3 39455.9 36427.4 2021年7月26日 37276.6 8#4 2021年7月26日 37276.6 35392.3 40522.9 35236.7 2021年7月25日 35391.1 9#5 2021年7月25日 35391.1 34392.5 35391.1 33881.3 2021年7月24日 33824.8 10#6 2021年7月24日 33824.8 33600.5 33955.0 33412.9 2021年7月23日 33603.3 11#7 2021年7月23日 33603.3 32297.9 33605.6 32041.1 2021年7月22日 32298.9 12# ・・・

投稿2021/08/08 04:26

meg_

総合スコア10607

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

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

tanak.aaaaa

2021/08/10 01:52

回答ありがとうございます。 forループを使うことばかり考えていましたのでこのように使わない方法を提示していただけると大変勉強になります。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問