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

回答編集履歴

3

Update

2022/03/25 23:45

投稿

melian
melian

スコア21343

answer CHANGED
@@ -1,36 +1,20 @@
1
+ > crosstab() で dropna=False については下記のコードではageの'10-19'が表示できませんでした。どこがまちがっているでしょうか。
2
+
1
- `groupby` で代用してみした
3
+ `df['age']` を `pd.core.dtypes.dtypes.CategoricalDtype` 型にキャストする必要があり
2
4
  ```python
3
5
  import pandas as pd
6
+ import numpy as np
4
7
 
5
- df = pd.DataFrame({
6
- 'name': [chr(i) for i in range(65, 88)],
7
- 'age': [*range(7), *range(10, 14), *range(30, 40), 30, 31],
8
- 'sex': [*['M']*3, *['F']*4, *['M']*2, *['F']*2, *['M']*4, *['F']*8],
8
+ df=pd.DataFrame({'age':['0-9','20-29','0-9','30-39'],'sex':[1,2,2,1]})
9
+ category = pd.api.types.CategoricalDtype(['0-9','10-19','20-29','30-39'])
10
+ b=pd.crosstab(df['age'].astype(category),df['sex'],dropna=False)
11
+ print(b)
9
12
 
10
- })
11
-
12
13
  #
13
- count = (
14
- df.groupby([pd.cut(df['age'], bins=[0, 10, 20, 30, 40], right=False,
15
- labels=['0-9', '10-19', '20-29', '30-39']), 'sex'])
16
- .size().unstack()[['M', 'F']])
17
-
18
- #
19
- sex M F
14
+ sex 1 2
20
15
  age
21
- 0-9 3 4
16
+ 0-9 1 1
22
- 10-19 2 2
17
+ 10-19 0 0
23
- 20-29 0 0
18
+ 20-29 0 1
24
- 30-39 4 8
19
+ 30-39 1 0
25
20
  ```
26
-
27
- **追記**
28
- > crosstab() で dropna=False については下記のコードではageの'10-19'が表示できませんでした。どこがまちがっているでしょうか。
29
-
30
- `df2['age']` を `pd.core.dtypes.dtypes.CategoricalDtype` 型にキャストする必要があります。
31
-
32
- ```python
33
- df2['age'] = df2['age'].astype('category')
34
- b=pd.crosstab(df2['age'],df2['sex'],dropna=False)
35
- print(b)
36
- ```

2

Update

2022/03/25 23:38

投稿

melian
melian

スコア21343

answer CHANGED
@@ -22,4 +22,15 @@
22
22
  10-19 2 2
23
23
  20-29 0 0
24
24
  30-39 4 8
25
- ```
25
+ ```
26
+
27
+ **追記**
28
+ > crosstab() で dropna=False については下記のコードではageの'10-19'が表示できませんでした。どこがまちがっているでしょうか。
29
+
30
+ `df2['age']` を `pd.core.dtypes.dtypes.CategoricalDtype` 型にキャストする必要があります。
31
+
32
+ ```python
33
+ df2['age'] = df2['age'].astype('category')
34
+ b=pd.crosstab(df2['age'],df2['sex'],dropna=False)
35
+ print(b)
36
+ ```

1

Update

2022/03/24 15:23

投稿

melian
melian

スコア21343

answer CHANGED
@@ -1,4 +1,4 @@
1
- `groupby` で代用してみました。※ index の label は適宜付けて下さい
1
+ `groupby` で代用してみました。
2
2
  ```python
3
3
  import pandas as pd
4
4
 
@@ -11,15 +11,15 @@
11
11
 
12
12
  #
13
13
  count = (
14
- df.groupby([pd.cut(df['age'], bins=[0, 10, 20, 30, 40], right=False), 'sex'])
14
+ df.groupby([pd.cut(df['age'], bins=[0, 10, 20, 30, 40], right=False,
15
+ labels=['0-9', '10-19', '20-29', '30-39']), 'sex'])
15
- .count()['age'].unstack()[['M', 'F']])
16
+ .size().unstack()[['M', 'F']])
16
- print(count)
17
17
 
18
18
  #
19
- sex M F
19
+ sex M F
20
- age
20
+ age
21
- [0, 10) 3 4
21
+ 0-9 3 4
22
- [10, 20) 2 2
22
+ 10-19 2 2
23
- [20, 30) 0 0
23
+ 20-29 0 0
24
- [30, 40) 4 8
24
+ 30-39 4 8
25
25
  ```