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

回答編集履歴

4

d

2020/02/18 06:36

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -22,4 +22,18 @@
22
22
  # 3 11-Feb-2020 00:00 431 33 81.17%
23
23
  # 4 12-Feb-2020 00:00 21 12 63.64%
24
24
  # 5 13-Feb-2020 00:00 100 10 68.97%
25
+ ```
26
+
27
+ ## 追記
28
+
29
+ 単にグループごとの割合を見たいのであれば以下
30
+
31
+ ```python
32
+ df2 = df.groupby("A").sum()["B"] / df["B"].sum()
33
+ print(df2)
34
+ # A
35
+ # 11-Feb-2020 00:00 0.748942
36
+ # 12-Feb-2020 00:00 0.046544
37
+ # 13-Feb-2020 00:00 0.204513
38
+ # Name: B, dtype: float64
25
39
  ```

3

f

2020/02/18 06:35

投稿

tiitoi
tiitoi

スコア21960

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

2

d

2020/02/18 06:29

投稿

tiitoi
tiitoi

スコア21960

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

1

d

2020/02/18 06:18

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -7,8 +7,10 @@
7
7
  ```python
8
8
  import pandas as pd
9
9
 
10
+ # この質問からテーブルをとってくる
10
11
  df = pd.read_html("https://teratail.com/questions/242055", skiprows=1)[0]
11
12
 
13
+ # 本題のコード
12
14
  df["Share"] = df["B"] / df["B"].sum()
13
15
  print(df["Share"].sum()) # 0.9999999999999999
14
16