>source

아래 2 개의 DataFrame을 병합하여 각 날짜에 각 코드가 나열되고 해당 날짜의 원래 데이터 프레임에 코드가 없으면 수량이 0으로 채워지는 출력을 얻으려고합니다. 아래에 입력 및 원하는 출력의 예를 넣었지만 라이브 데이터에는 1 년 이상의 날짜와 20,000 개 이상의 코드가있을 것입니다.

입력 데이터:

df1

   date
0   2021-05-03
1   2021-05-04
2   2021-05-05
3   2021-05-06
4   2021-05-07
5   2021-05-08
6   2021-05-09
7   2021-05-10

df2

   date      code  qty
0   2021-05-03  A   2
1   2021-05-06  A   5
2   2021-05-07  A   4
3   2021-05-08  A   5
4   2021-05-10  A   6
5   2021-05-04  B   1
6   2021-05-08  B   4

원하는 출력 :

date      code  qty
03/05/2021  A   2
03/05/2021  B   0
04/05/2021  A   0
04/05/2021  B   1
05/05/2021  A   0
05/05/2021  B   0
06/05/2021  A   5
06/05/2021  B   0
07/05/2021  A   4
07/05/2021  B   0
08/05/2021  A   5
08/05/2021  B   4
09/05/2021  A   0
09/05/2021  B   0
10/05/2021  A   6
10/05/2021  B   0

아래 병합을 시도했지만 결과가 원하는대로 표시되지 않는 것 같습니다.

df_new = df1.merge(df2, how='left', on='date')
    date      code  qty
0   2021-05-03  A   2.0
1   2021-05-04  B   1.0
2   2021-05-05  NaN NaN
3   2021-05-06  A   5.0
4   2021-05-07  A   4.0
5   2021-05-08  A   5.0
6   2021-05-08  B   4.0
7   2021-05-09  NaN NaN
8   2021-05-10  A   6.0


  • 답변 # 1

    이것은 a에 더 적합합니다 reindex . 모든 조합을 만들고, 인덱스를 설정하고, 이러한 모든 조합에 대해 다시 인덱싱하고, 채운 다음 인덱스를 재설정합니다.

    import pandas as pd
    idx = pd.MultiIndex.from_product([df1.date, df2['code'].unique()],
                                     names=['date', 'code'])
    df2 = (df2.set_index(['date', 'code'])
              .reindex(idx)
              .fillna(0, downcast='infer')
              .reset_index())
    
    
    <시간 />
             date code  qty
    0   2021-05-03    A    2
    1   2021-05-03    B    0
    2   2021-05-04    A    0
    3   2021-05-04    B    1
    4   2021-05-05    A    0
    5   2021-05-05    B    0
    6   2021-05-06    A    5
    7   2021-05-06    B    0
    8   2021-05-07    A    4
    9   2021-05-07    B    0
    10  2021-05-08    A    5
    11  2021-05-08    B    4
    12  2021-05-09    A    0
    13  2021-05-09    B    0
    14  2021-05-10    A    6
    15  2021-05-10    B    0
    
    

  • 답변 # 2

    하나의 옵션 pivotstack :

    (df2.pivot_table(index='date', columns='code', fill_value=0)
        .reindex(df1.date, fill_value=0)
        .stack('code')
        .reset_index()
    )
    
    

    산출:

             date code  qty
    0   2021-05-03    A    2
    1   2021-05-03    B    0
    2   2021-05-04    A    0
    3   2021-05-04    B    1
    4   2021-05-05    A    0
    5   2021-05-05    B    0
    6   2021-05-06    A    5
    7   2021-05-06    B    0
    8   2021-05-07    A    4
    9   2021-05-07    B    0
    10  2021-05-08    A    5
    11  2021-05-08    B    4
    12  2021-05-09    A    0
    13  2021-05-09    B    0
    14  2021-05-10    A    6
    15  2021-05-10    B    0
    
    

  • 답변 # 3

    cross-join 중에서 df1unique valscode . 그런 다음 df.fillna() :

    In [480]: x = pd.DataFrame(df2.code.unique())
    In [483]: y = df1.assign(key=1).merge(x.assign(key=1), on='key').drop('key', 1).rename(columns={0: 'code'})
    In [486]: res = y.merge(df2, how='left').fillna(0)
    In [487]: res
    Out[487]: 
              date code  qty
    0   2021-05-03    A  2.0
    1   2021-05-03    B  0.0
    2   2021-05-04    A  0.0
    3   2021-05-04    B  1.0
    4   2021-05-05    A  0.0
    5   2021-05-05    B  0.0
    6   2021-05-06    A  5.0
    7   2021-05-06    B  0.0
    8   2021-05-07    A  4.0
    9   2021-05-07    B  0.0
    10  2021-05-08    A  5.0
    11  2021-05-08    B  4.0
    12  2021-05-09    A  0.0
    13  2021-05-09    B  0.0
    14  2021-05-10    A  6.0
    15  2021-05-10    B  0.0
    
    

  • 이전 javascript - Leaflet에서 Circle getBounds () 메서드가 실패합니다
  • 다음 파이썬에서 실시간으로 ntplib의 if 문을 사용하는 방법은 무엇입니까?