Python 熊猫:如何为缺失年份的每一行填充值

Python 熊猫:如何为缺失年份的每一行填充值,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个表,其中包含关键字及其每年出现的次数,但如果在某些年份中没有出现,则这些年份将丢失 但是我现在需要用零来填充那些年,我怎样才能用熊猫数据帧来填充呢 我的数据如下表所示,从2003年到2015年的13年内,每个关键字都应该填充为零 +---------+------+-------+ | keyword | year | count | +---------+------+-------+ | a | 2003 | 1 | | a | 2004 |

我有一个表,其中包含关键字及其每年出现的次数,但如果在某些年份中没有出现,则这些年份将丢失

但是我现在需要用零来填充那些年,我怎样才能用熊猫数据帧来填充呢

我的数据如下表所示,从2003年到2015年的13年内,每个关键字都应该填充为零

+---------+------+-------+ | keyword | year | count | +---------+------+-------+ | a | 2003 | 1 | | a | 2004 | 2 | | b | 2003 | 1 | | b | 2005 | 2 | +---------+------+-------+ +---------+------+-------+ |关键词|年份|计数| +---------+------+-------+ |a | 2003 | 1| |a | 2004 | 2| |b | 2003 | 1| |b | 2005 | 2| +---------+------+-------+ 预期结果:

+---------+------+-------+ | keyword | year | count | +---------+------+-------+ | a | 2003 | 1 | | a | 2004 | 2 | | a | 2005 | 0 | | a | 2006 | 0 | | a | 2007 | 0 | | a | 2008 | 0 | | a | 2009 | 0 | | a | 2010 | 0 | | a | 2011 | 0 | | a | 2012 | 0 | | a | 2013 | 0 | | a | 2014 | 0 | | a | 2015 | 0 | | b | 2003 | 1 | | b | 2004 | 0 | | b | 2005 | 2 | | b | 2006 | 0 | | ... | ... | ... | +---------+------+-------+ +---------+------+-------+ |关键词|年份|计数| +---------+------+-------+ |a | 2003 | 1| |a | 2004 | 2| |a | 2005 | 0| |a | 2006 | 0| |a | 2007 | 0| |a | 2008 | 0| |a | 2009 | 0| |a | 2010 | 0| |a | 2011 | 0| |a | 2012 | 0| |a | 2013 | 0| |a | 2014 | 0| |a | 2015 | 0| |b | 2003 | 1| |b | 2004 | 0| |b | 2005 | 2| |b | 2006 | 0| | ... | ... | ... | +---------+------+-------+
我该怎么做?我搜索了StackOverflow,只找到了非重复日期的答案,但我的年份在这里重复。

您可以通过创建新的
MultiIndex
by,然后将列转换为
MultiIndex
by,并且:

另一种解决方案是创建新的
DataFrame
,并通过左连接,最后一次重新连接缺少的值:


你查过了吗?@yatu-谢谢。
mux = pd.MultiIndex.from_product([df['keyword'].unique(), 
                                  np.arange(2003, 2016)], names=['keyword','year'])
df = df.set_index(['keyword','year']).reindex(mux, fill_value=0).reset_index()

print (df)
   keyword  year  count
0        a  2003      1
1        a  2004      2
2        a  2005      0
3        a  2006      0
4        a  2007      0
5        a  2008      0
6        a  2009      0
7        a  2010      0
8        a  2011      0
9        a  2012      0
10       a  2013      0
11       a  2014      0
12       a  2015      0
13       b  2003      1
14       b  2004      0
15       b  2005      2
16       b  2006      0
17       b  2007      0
18       b  2008      0
19       b  2009      0
20       b  2010      0
21       b  2011      0
22       b  2012      0
23       b  2013      0
24       b  2014      0
25       b  2015      0
from  itertools import product
df1 = pd.DataFrame(list(product(df['keyword'].unique(), 
           np.arange(2003, 2016))), columns=['keyword','year'])
df = df1.merge(df, how='left').fillna({'count':0}, downcast='int')