回答編集履歴

1

修正後のデータに対応

2020/12/24 14:49

投稿

Daregada
Daregada

スコア11990

test CHANGED
@@ -1,4 +1,4 @@
1
- `pivot`でcol2とcol4をまとめて表にしてしまい、col4の2列を削除してから、列名を付け直せばいいのでは。
1
+ `pivot`でcol2とcol4以降をまとめて表にしてしまい、col4以降不要な2列を削除してから、列名を付け直せばいいのでは。
2
2
 
3
3
 
4
4
 
@@ -12,31 +12,29 @@
12
12
 
13
13
  txt = """
14
14
 
15
- col1 col2 col3 col4
15
+ col1 col2 col3 col4 col5 col6
16
16
 
17
- A 1 0900 100
17
+ A 1 0900 100 200 300
18
18
 
19
- A 2 0920 100
19
+ A 2 0920 100 200 300
20
20
 
21
- A 3 0930 100
21
+ A 3 0930 100 200 300
22
22
 
23
- B 11 0900 200
23
+ B 11 0900 200 300 400
24
24
 
25
- B 12 0920 200
25
+ B 12 0920 200 300 400
26
26
 
27
- B 13 0930 200
27
+ B 13 0930 200 300 400
28
28
 
29
- C 21 0900 300
29
+ C 21 0900 300 400 500
30
30
 
31
- C 22 0920 300
31
+ C 22 0920 300 400 500
32
32
 
33
- C 23 0930 300
33
+ C 23 0930 300 400 500
34
34
 
35
35
  """
36
36
 
37
37
 
38
-
39
- # 元のデータフレームを再現
40
38
 
41
39
  df = pd.read_csv(io.StringIO(txt), delim_whitespace=True)
42
40
 
@@ -44,19 +42,15 @@
44
42
 
45
43
 
46
44
 
47
- # col2とcol4をvaluesに指定(したのと同じ結果)
48
-
49
45
  dfp = df.pivot(index=['col1'], columns=['col3'])
50
46
 
51
47
  print(dfp, end='\n\n')
52
48
 
53
49
 
54
50
 
55
- # 末尾2列を削除し、列名を付け直し
51
+ dfp.drop(dfp.columns[[i for i in range(4, len(dfp.columns)) if i % 3 != 0]], axis=1, inplace=True)
56
52
 
57
- dfp.drop(dfp.columns[[4, 5]], axis=1, inplace=True)
58
-
59
- dfp.columns = [900, 920, 930, 'col4']
53
+ dfp.columns = [t[1] if i < 3 else t[0] for i, t in enumerate(dfp.columns)]
60
54
 
61
55
  dfp.index.name = None
62
56
 
@@ -68,48 +62,48 @@
68
62
 
69
63
  ```result
70
64
 
71
- col1 col2 col3 col4
65
+ col1 col2 col3 col4 col5 col6
72
66
 
73
- 0 A 1 900 100
67
+ 0 A 1 900 100 200 300
74
68
 
75
- 1 A 2 920 100
69
+ 1 A 2 920 100 200 300
76
70
 
77
- 2 A 3 930 100
71
+ 2 A 3 930 100 200 300
78
72
 
79
- 3 B 11 900 200
73
+ 3 B 11 900 200 300 400
80
74
 
81
- 4 B 12 920 200
75
+ 4 B 12 920 200 300 400
82
76
 
83
- 5 B 13 930 200
77
+ 5 B 13 930 200 300 400
84
78
 
85
- 6 C 21 900 300
79
+ 6 C 21 900 300 400 500
86
80
 
87
- 7 C 22 920 300
81
+ 7 C 22 920 300 400 500
88
82
 
89
- 8 C 23 930 300
83
+ 8 C 23 930 300 400 500
90
84
 
91
85
 
92
86
 
93
- col2 col4
87
+ col2 col4 col5 col6
94
88
 
95
- col3 900 920 930 900 920 930
89
+ col3 900 920 930 900 920 930 900 920 930 900 920 930
96
90
 
97
91
  col1
98
92
 
99
- A 1 2 3 100 100 100
93
+ A 1 2 3 100 100 100 200 200 200 300 300 300
100
94
 
101
- B 11 12 13 200 200 200
95
+ B 11 12 13 200 200 200 300 300 300 400 400 400
102
96
 
103
- C 21 22 23 300 300 300
97
+ C 21 22 23 300 300 300 400 400 400 500 500 500
104
98
 
105
99
 
106
100
 
107
- 900 920 930 col4
101
+ 900 920 930 col4 col5 col6
108
102
 
109
- A 1 2 3 100
103
+ A 1 2 3 100 200 300
110
104
 
111
- B 11 12 13 200
105
+ B 11 12 13 200 300 400
112
106
 
113
- C 21 22 23 300
107
+ C 21 22 23 300 400 500
114
108
 
115
109
  ```