我有一个表,其中包含关键字及其每年发生的次数,但是如果某些年没有发生,则这些年份会丢失。
但是我现在需要用0填充那些年份,如何使用Pandas数据框呢?
我的数据如下表所示,从2003年到2015年的13年内,每个关键字都应补零。
+---------+------+-------+ | keyword | year | count | +---------+------+-------+ | 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 | | ... | ... | ... | +---------+------+-------+
我该怎么做?我搜索了StackOverflow,仅在非重复日期找到了答案,但是在这里,我的岁月在重复。
答案 0 :(得分:3)
您可以通过MultiIndex.from_product
创建新的MultiIndex
,然后通过DataFrame.set_index
和DataFrame.reindex
将列转换为MultiIndex
:
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
另一种解决方案是通过itertools.product
和DataFrame.merge
创建带有左联接的新DataFrame
,最后用DataFrame.fillna
弥补缺失的值:
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')