Pandasでcross joinを行いたいを参考にしてDAYとnameの交差結合を行います。
そのさい、元コードと同じ行の並びになるようにname
にid
を振っておきます。
交差結合後、id
,DAY
順で並べ替えます。
Python
1import pandas as pd
2
3df1 = pd.DataFrame({
4 'DAY':pd.date_range(start='2021/10/1', end='2021/10/2', freq='D'),
5 'key':1
6})
7
8col = list('cba')
9df2 = pd.DataFrame({
10 'name':col,
11 'id':[i for i,_ in enumerate(col)],
12 'key':1
13})
14
15df = df1.merge(df2, how='outer').drop(columns=['key'])
16df = df.sort_values(['id','DAY']).drop(columns=['id']).reset_index(drop=True)
17print(df)
18"""
19 DAY name
200 2021-10-01 c
211 2021-10-02 c
222 2021-10-01 b
233 2021-10-02 b
244 2021-10-01 a
255 2021-10-02 a
26"""
追記
pandas 1.2.0
以降であればcross
が使えるので直接交差結合できます。
そのさいname
にDAY
を結合すると、列の並びは元コードと変わりますが、おそらく行ソートも不要になります。
pandas.DataFrame.merge
cross: creates the cartesian product from both frames, preserves the order of the left keys.
とあるので左側(name
)の並びは保持されますが、おそらく右側(DAY
)の並びも大丈夫でしょう。
Python
1import pandas as pd
2
3df1 = pd.DataFrame({'DAY':pd.date_range(start='2021/10/1', end='2021/10/2', freq='D')})
4
5col = list('cba')
6df2 = pd.DataFrame({'name':col})
7
8df = df2.merge(df1, how='cross')
9print(df)
10"""
11 name DAY
120 c 2021-10-01
131 c 2021-10-02
142 b 2021-10-01
153 b 2021-10-02
164 a 2021-10-01
175 a 2021-10-02
18"""
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/11 02:01 編集
2021/09/11 02:17
2021/09/11 02:20
2021/09/11 02:29 編集