合并数据框时用零填充缺失日期的数据

use*_*827 4 python pandas

import pandas as pd\nimport numpy as np\n\none = pd.read_csv('data1.csv')\ntwo = pd.read_csv('data2.csv')\n
Run Code Online (Sandbox Code Playgroud)\n\n

我这样写代码,其中一个显示

\n\n
A    Date\n10    2011-01-03\n20    2011-01-04\n10    2011-01-06\n20    2011-01-07\n30    2011-01-10\n40    2011-01-13\n25    2011-01-15\n\xe3\x83\xbb\n\xe3\x83\xbb\n\xe3\x83\xbb\n
Run Code Online (Sandbox Code Playgroud)\n\n

两个\xc2\xa0显示

\n\n
B    Date\n15    2011-01-01\n15    2011-01-02\n15    2011-01-03\n25    2011-01-07\n35    2011-01-10\n10    2011-01-13\n25    2011-01-15\n\xe3\x83\xbb\n\xe3\x83\xbb\n\xe3\x83\xbb\n
Run Code Online (Sandbox Code Playgroud)\n\n

我想在数据框被标记时将 0 添加到缺失的 date\xe2\x80\x99s 数据中。\n现在我编写了代码

\n\n
one_and_two = pd.merge(one, two, on='Date', how='inner')\nprint(one_and_two)\n
Run Code Online (Sandbox Code Playgroud)\n\n

并运行,one_and_two 是

\n\n
   \xe3\x80\x80A        Date  \xe3\x80\x80 B\n0  10  2011-01-03  15\n1  20  2011-01-07  25\n2  30  2011-01-10  35\n3  40  2011-01-13  10\n4  25  2011-01-15  25\n\xe3\x83\xbb\n\xe3\x83\xbb\n\xe3\x83\xbb\n
Run Code Online (Sandbox Code Playgroud)\n\n

理想的输出是

\n\n
   \xe3\x80\x80A        Date  \xe3\x80\x80 B\n0  0  2011-01-01  15\n1  0  2011-01-02  15\n2  10  2011-01-03  15\n3  20  2011-01-04  0\n4  0  2011-01-05  0\n5  10  2011-01-06  0\n6  20  2011-01-07  25\n7  0  2011-01-08  0\n8  0  2011-01-09  0\n9  30  2011-01-10  35\n\xe3\x83\xbb\n\xe3\x83\xbb\n\xe3\x83\xbb\n
Run Code Online (Sandbox Code Playgroud)\n\n

Dataframe 有 2011-01-01 \xe3\x80\x9c2011-12-31 ,\n我想将 0 放入缺失的 date\xe2\x80\x99s 数据,但是 \n我该怎么做?我的代码出了什么问题?

\n

jez*_*ael 8

使用reindex具有定义的日期范围的外连接:

df = (pd.merge(one, two, on='Date', how='outer')
        .fillna(0)
        .sort_values('Date')
        .set_index('Date'))

df = (df.reindex(pd.date_range('2011-01-01', '2011-12-31'), name='Date'), fill_value=0)
        .reset_index()
        .reindex(columns=['A','Date','B']))
Run Code Online (Sandbox Code Playgroud)

或者按最小和最大日期:

df = (df.reindex(pd.date_range(df.index.min(), df.index.max(), name='Date'), fill_value=0)
        .reset_index()
        .reindex(columns=['A','Date','B']))
print (df)
       A       Date     B
0    0.0 2011-01-01  15.0
1    0.0 2011-01-02  15.0
2   10.0 2011-01-03  15.0
3   20.0 2011-01-04   0.0
4    0.0 2011-01-05   0.0
5   10.0 2011-01-06   0.0
6   20.0 2011-01-07  25.0
7    0.0 2011-01-08   0.0
8    0.0 2011-01-09   0.0
9   30.0 2011-01-10  35.0
10   0.0 2011-01-11   0.0
11   0.0 2011-01-12   0.0
12  40.0 2011-01-13  10.0
13   0.0 2011-01-14   0.0
14  25.0 2011-01-15  25.0
Run Code Online (Sandbox Code Playgroud)