質問するログイン新規登録

回答編集履歴

3

(追記)に環境を追加

2026/02/12 09:59

投稿

little_street
little_street

スコア553

answer CHANGED
@@ -26,7 +26,7 @@
26
26
 
27
27
  (追記)
28
28
 
29
- 行数を10万行に増やして処理時間を比較をしてみたところ,apply() メソッドはリスト内包表記よりもかなり遅いようです(上記回答は一部訂正しました)。
29
+ 行数を10万行に増やして処理時間を比較をしてみたところ,apply() メソッドはリスト内包表記よりもかなり遅いようです(上記回答は一部訂正しました)。なお,環境は「macOS(M1)15.7.3,Python 3.13.11,pandas 3.0.0」です。
30
30
 
31
31
  mask() メソッド: 0.0012 s
32
32
  リスト内包表記: 0.0277 s

2

処理時間に関する内容を訂正,処理時間の比較を(追記)

2026/02/12 07:15

投稿

little_street
little_street

スコア553

answer CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  今回のケースでは,既に回答されているように numpy の `where()` 関数や pandas の `where()` メソッド,[mask() メソッド](https://pandas.pydata.org/docs/reference/api/pandas.Series.mask.html) などを用いるのが簡明で処理時間も短くなります。
4
4
 
5
- 一方,リスト内包表記のように行内の計算式がわかる記述をしたいのであれば,[apply() メソッド](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.apply.html) を `axis=1` とともに用いる方法も考えられ,通常はリスト内包表記より処理時間はなります
5
+ 一方,リスト内包表記のように行内の計算式がわかる記述をしたいのであれば,[apply() メソッド](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.apply.html) を `axis=1` とともに用いる方法も考えられますが,処理時間について(追記)を参照ださい
6
6
 
7
7
  記述例を下記に示します。
8
8
 
@@ -23,3 +23,31 @@
23
23
  # 2 2 12 22 22
24
24
  # 3 3 13 23 23
25
25
  ```
26
+
27
+ (追記)
28
+
29
+ 行数を10万行に増やして処理時間を比較をしてみたところ,apply() メソッドはリスト内包表記よりもかなり遅いようです(上記回答は一部訂正しました)。
30
+
31
+ mask() メソッド: 0.0012 s
32
+ リスト内包表記: 0.0277 s
33
+ apply() メソッド: 0.2940 s
34
+
35
+ ```Python
36
+ import pandas as pd
37
+ import time
38
+
39
+ n = 100000
40
+
41
+ df = pd.DataFrame({'t': list(range(0, n)),
42
+ 'x': list(range(10, n + 10)),
43
+ 'y': list(range(20, n + 20))})
44
+
45
+ start = time.perf_counter()
46
+
47
+ # df['z'] = df['x'].mask(df['t'] > 1, df['y'])
48
+ # df['z'] = [y if t > 1 else x for t, x, y in zip(df['t'], df['x'], df['y'])]
49
+ df['z'] = df.apply(lambda r: r['y'] if r['t'] > 1 else r['x'], axis=1)
50
+
51
+ end = time.perf_counter()
52
+ print(f'{(end - start):.4f} s')
53
+ ```

1

リンク先を修正

2026/02/11 23:52

投稿

little_street
little_street

スコア553

answer CHANGED
@@ -1,6 +1,6 @@
1
1
  既に解決済みなので御参考です。
2
2
 
3
- 今回のケースでは,既に回答されているように numpy の `where()` 関数や pandas の `where()` メソッド,[mask() メソッド](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.mask.html) などを用いるのが簡明で処理時間も短くなります。
3
+ 今回のケースでは,既に回答されているように numpy の `where()` 関数や pandas の `where()` メソッド,[mask() メソッド](https://pandas.pydata.org/docs/reference/api/pandas.Series.mask.html) などを用いるのが簡明で処理時間も短くなります。
4
4
 
5
5
  一方,リスト内包表記のように行内の計算式がわかる記述をしたいのであれば,[apply() メソッド](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.apply.html) を `axis=1` とともに用いる方法も考えられ,通常はリスト内包表記より処理時間は短くなります。
6
6