回答編集履歴

2

追記

2021/09/11 02:16

投稿

8524ba23
8524ba23

スコア38341

test CHANGED
@@ -59,3 +59,63 @@
59
59
  """
60
60
 
61
61
  ```
62
+
63
+
64
+
65
+ # 追記
66
+
67
+
68
+
69
+ `pandas 1.2.0`以降であれば`cross`が使えるので直接交差結合できます。
70
+
71
+ そのさい`name`に`DAY`を結合すると、列の並びは元コードと変わりますが、おそらく行ソートも不要になります。
72
+
73
+
74
+
75
+ [pandas.DataFrame.merge](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.merge.html?highlight=merge#pandas.DataFrame.merge)
76
+
77
+ > cross: creates the cartesian product from both frames, preserves the order of the left keys.
78
+
79
+
80
+
81
+ とあるので左側(`name`)の並びは保持されますが、おそらく右側(`DAY`)の並びも大丈夫でしょう。
82
+
83
+ ```Python
84
+
85
+ import pandas as pd
86
+
87
+
88
+
89
+ df1 = pd.DataFrame({'DAY':pd.date_range(start='2021/10/1', end='2021/10/2', freq='D')})
90
+
91
+
92
+
93
+ col = list('cba')
94
+
95
+ df2 = pd.DataFrame({'name':col})
96
+
97
+
98
+
99
+ df = df2.merge(df1, how='cross')
100
+
101
+ print(df)
102
+
103
+ """
104
+
105
+ name DAY
106
+
107
+ 0 c 2021-10-01
108
+
109
+ 1 c 2021-10-02
110
+
111
+ 2 b 2021-10-01
112
+
113
+ 3 b 2021-10-02
114
+
115
+ 4 a 2021-10-01
116
+
117
+ 5 a 2021-10-02
118
+
119
+ """
120
+
121
+ ```

1

コード修正

2021/09/11 02:16

投稿

8524ba23
8524ba23

スコア38341

test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  そのさい、元コードと同じ行の並びになるように`name`に`id`を振っておきます。
4
4
 
5
- 交差結合後、`id`で並べ替えます。
5
+ 交差結合後、`id`,`DAY`順で並べ替えます。
6
6
 
7
7
  ```Python
8
8
 
@@ -36,7 +36,7 @@
36
36
 
37
37
  df = df1.merge(df2, how='outer').drop(columns=['key'])
38
38
 
39
- df = df.sort_values(['id']).drop(columns=['id']).reset_index(drop=True)
39
+ df = df.sort_values(['id','DAY']).drop(columns=['id']).reset_index(drop=True)
40
40
 
41
41
  print(df)
42
42