回答編集履歴
3
(追記)に環境を追加
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
処理時間に関する内容を訂正,処理時間の比較を(追記)
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
リンク先を修正
answer
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
既に解決済みなので御参考です。
|
|
2
2
|
|
|
3
|
-
今回のケースでは,既に回答されているように numpy の `where()` 関数や pandas の `where()` メソッド,[mask() メソッド](https://pandas.pydata.org/docs/reference/api/pandas.
|
|
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
|
|