回答編集履歴

4

d

2020/02/18 06:36

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -47,3 +47,31 @@
47
47
  # 5 13-Feb-2020 00:00 100 10 68.97%
48
48
 
49
49
  ```
50
+
51
+
52
+
53
+ ## 追記
54
+
55
+
56
+
57
+ 単にグループごとの割合を見たいのであれば以下
58
+
59
+
60
+
61
+ ```python
62
+
63
+ df2 = df.groupby("A").sum()["B"] / df["B"].sum()
64
+
65
+ print(df2)
66
+
67
+ # A
68
+
69
+ # 11-Feb-2020 00:00 0.748942
70
+
71
+ # 12-Feb-2020 00:00 0.046544
72
+
73
+ # 13-Feb-2020 00:00 0.204513
74
+
75
+ # Name: B, dtype: float64
76
+
77
+ ```

3

f

2020/02/18 06:35

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -1 +1,49 @@
1
- 間違があったので編集中
1
+ 以下のようになると思ます。
2
+
3
+
4
+
5
+ 1. 列を指定してグルーピング df.groupby("A")
6
+
7
+ 2. transform("sum") でグループごとに合計を計算し、元の DataFrame に合わせる
8
+
9
+ 3. B 列をグループごとの合計で割ることでグループごとの割合を算出
10
+
11
+ 4. %表記にしたければ、float を文字列にフォーマット
12
+
13
+
14
+
15
+ ```python
16
+
17
+ import pandas as pd
18
+
19
+ import numpy as np
20
+
21
+
22
+
23
+ df = pd.read_csv("sample.csv")
24
+
25
+ # グループごとに割合を計算
26
+
27
+ df["Share"] = df["B"] / df.groupby("A").transform("sum")["B"]
28
+
29
+ # % 表記に変更
30
+
31
+ df["Share"] = df["Share"].map(lambda x: '{:.2%}'.format(x))
32
+
33
+ print(df)
34
+
35
+ # A B C Share
36
+
37
+ # 0 11-Feb-2020 00:00 100 10 18.83%
38
+
39
+ # 1 12-Feb-2020 00:00 12 22 36.36%
40
+
41
+ # 2 13-Feb-2020 00:00 45 10 31.03%
42
+
43
+ # 3 11-Feb-2020 00:00 431 33 81.17%
44
+
45
+ # 4 12-Feb-2020 00:00 21 12 63.64%
46
+
47
+ # 5 13-Feb-2020 00:00 100 10 68.97%
48
+
49
+ ```

2

d

2020/02/18 06:29

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -1,53 +1 @@
1
- 「Bの行の値/B列の合計値でShareの列を追加」は質問のコードで問題ないと思います。
2
-
3
- 実際、計算したあとに `df["Share"].sum()` を計算すると、合計はほぼ1になります。
4
-
5
- 実際は、浮動小数点演算なので、厳密に1にはならず、`0.999999999999` のような値になります。
6
-
7
-
8
-
9
- ##
10
-
11
-
12
-
13
- ```python
14
-
15
- import pandas as pd
16
-
17
-
18
-
19
- # この質問からテーブルをとってくる
20
-
21
- df = pd.read_html("https://teratail.com/questions/242055", skiprows=1)[0]
22
-
23
-
24
-
25
- # 本題コード
1
+ 間違いがあったで編集中
26
-
27
- df["Share"] = df["B"] / df["B"].sum()
28
-
29
- print(df["Share"].sum()) # 0.9999999999999999
30
-
31
-
32
-
33
- # % 表記に変更
34
-
35
- df["Share"] = df["Share"].map(lambda x: '{:.2%}'.format(x))
36
-
37
- print(df)
38
-
39
- # A B C Share
40
-
41
- # 0 11-Feb-2020 00:00 100 10 16.67%
42
-
43
- # 1 12-Feb-2020 00:00 100 10 16.67%
44
-
45
- # 2 13-Feb-2020 00:00 100 10 16.67%
46
-
47
- # 3 11-Feb-2020 00:00 100 10 16.67%
48
-
49
- # 4 12-Feb-2020 00:00 100 10 16.67%
50
-
51
- # 5 13-Feb-2020 00:00 100 10 16.67%
52
-
53
- ```

1

d

2020/02/18 06:18

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -16,9 +16,13 @@
16
16
 
17
17
 
18
18
 
19
+ # この質問からテーブルをとってくる
20
+
19
21
  df = pd.read_html("https://teratail.com/questions/242055", skiprows=1)[0]
20
22
 
21
23
 
24
+
25
+ # 本題のコード
22
26
 
23
27
  df["Share"] = df["B"] / df["B"].sum()
24
28