opt*_*ime 3 python date pandas
我有一个熊猫数据框,如下所示:
id date value name
0 C1 2017-01-01 31 Company 1
1 C1 2017-01-02 35 Company 1
2 C1 2017-01-03 32 Company 1
3 C1 2017-01-06 36 Company 1
4 C1 2017-01-07 35 Company 1
5 C1 2017-01-08 34 Company 1
6 C1 2017-01-10 33 Company 1
7 C2 2017-01-01 225 Company 2
8 C2 2017-01-02 223 Company 2
9 C2 2017-01-03 223 Company 2
10 C2 2017-01-06 220 Company 2
11 C2 2017-01-07 222 Company 2
12 C2 2017-01-08 225 Company 2
13 C2 2017-01-10 224 Company 2
14 C3 2017-01-08 340 Company 3
Run Code Online (Sandbox Code Playgroud)
对于此数据框,日期范围为开始日期2017-01-01和结束日期2017-01-10(包括两者)。那就是所有数据都在这两个日期之间。
我想为缺少的日期添加新行。例如,对于id C1,在2017-01-04,2017-01-05,2017-01-09的value列中缺少值,应按如下所示在value列中添加新行,并添加0。
C1 2017-01-04 0 Company1
C1 2017-01-05 0 Company1
C1 2017-01-09 0 Company1
Run Code Online (Sandbox Code Playgroud)
类似地,对于C2,存在缺少的值值列2017-01-04,2017-01-05,2017-01-09和C3有缺失值2017年1月1日至2017年1月7日和2017-01-09,2017-01-10
我正在努力找出如何执行使用熊猫添加这些行的操作。因此,只是寻求一些帮助。
一种选择是创建要使用的所有日期pandas.date_range,然后可以在完整日期之间进行外部联接,并在日期列上键入每个子数据框,最后用0填充缺失值:
# create complete dates
dates = pd.DataFrame({"date": pd.date_range("2017-01-01", "2017-01-10")})
# convert date column to date time if it's not already
df['date'] = pd.to_datetime(df.date)
# merge complete dates with each sub data frame separately using groupby.apply
(df.groupby(['id', 'name'])['date', 'value']
.apply(lambda g: g.merge(dates, how="outer"))
.fillna(0)
.reset_index(level=[0,1])
.reset_index(drop=True))
# id name date value
#0 C1 Company 1 2017-01-01 31.0
#1 C1 Company 1 2017-01-02 35.0
#2 C1 Company 1 2017-01-03 32.0
#3 C1 Company 1 2017-01-06 36.0
#4 C1 Company 1 2017-01-07 35.0
#5 C1 Company 1 2017-01-08 34.0
#6 C1 Company 1 2017-01-10 33.0
#7 C1 Company 1 2017-01-04 0.0
#8 C1 Company 1 2017-01-05 0.0
#9 C1 Company 1 2017-01-09 0.0
# ...
Run Code Online (Sandbox Code Playgroud)