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

回答編集履歴

2

追記

2021/09/11 02:16

投稿

8524ba23
8524ba23

スコア38352

answer CHANGED
@@ -28,4 +28,34 @@
28
28
  4 2021-10-01 a
29
29
  5 2021-10-02 a
30
30
  """
31
+ ```
32
+
33
+ # 追記
34
+
35
+ `pandas 1.2.0`以降であれば`cross`が使えるので直接交差結合できます。
36
+ そのさい`name`に`DAY`を結合すると、列の並びは元コードと変わりますが、おそらく行ソートも不要になります。
37
+
38
+ [pandas.DataFrame.merge](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.merge.html?highlight=merge#pandas.DataFrame.merge)
39
+ > cross: creates the cartesian product from both frames, preserves the order of the left keys.
40
+
41
+ とあるので左側(`name`)の並びは保持されますが、おそらく右側(`DAY`)の並びも大丈夫でしょう。
42
+ ```Python
43
+ import pandas as pd
44
+
45
+ df1 = pd.DataFrame({'DAY':pd.date_range(start='2021/10/1', end='2021/10/2', freq='D')})
46
+
47
+ col = list('cba')
48
+ df2 = pd.DataFrame({'name':col})
49
+
50
+ df = df2.merge(df1, how='cross')
51
+ print(df)
52
+ """
53
+ name DAY
54
+ 0 c 2021-10-01
55
+ 1 c 2021-10-02
56
+ 2 b 2021-10-01
57
+ 3 b 2021-10-02
58
+ 4 a 2021-10-01
59
+ 5 a 2021-10-02
60
+ """
31
61
  ```

1

コード修正

2021/09/11 02:16

投稿

8524ba23
8524ba23

スコア38352

answer CHANGED
@@ -1,6 +1,6 @@
1
1
  [Pandasでcross joinを行いたい](https://esu-ko.hatenablog.com/entry/2020/06/11/Pandas%E3%81%A7cross_join%E3%82%92%E8%A1%8C%E3%81%84%E3%81%9F%E3%81%84)を参考にしてDAYとnameの交差結合を行います。
2
2
  そのさい、元コードと同じ行の並びになるように`name`に`id`を振っておきます。
3
- 交差結合後、`id`で並べ替えます。
3
+ 交差結合後、`id`,`DAY`順で並べ替えます。
4
4
  ```Python
5
5
  import pandas as pd
6
6
 
@@ -17,7 +17,7 @@
17
17
  })
18
18
 
19
19
  df = df1.merge(df2, how='outer').drop(columns=['key'])
20
- df = df.sort_values(['id']).drop(columns=['id']).reset_index(drop=True)
20
+ df = df.sort_values(['id','DAY']).drop(columns=['id']).reset_index(drop=True)
21
21
  print(df)
22
22
  """
23
23
  DAY name