Панды: Как определить значение для каждой строки, в которой пропущены годы - PullRequest
1 голос
/ 26 марта 2019

У меня есть таблица, содержащая ключевое слово и его повторяемость в каждом году, но если это не произойдет в течение нескольких лет, эти годы отсутствуют.

Но теперь мне нужно добавить эти годы к нулю, как я могу сделать это с кадром данных Pandas?

Мои данные похожи на таблицу ниже, каждое ключевое слово должно дополняться нулями до 13 лет с 2003 по 2015 год.

+---------+------+-------+
| 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 и нахожу ответы только на неповторяющуюся дату, но здесь мои годы повторяются.

1 Ответ

3 голосов
/ 26 марта 2019

Вы можете создать новые MultiIndex с помощью MultiIndex.from_product, а затем преобразовать столбцы в MultiIndex с помощью DataFrame.set_index и DataFrame.reindex:

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

Другое решение заключается в создании новых DataFrame с помощью itertools.product и DataFrame.merge с левым соединением, при последнем откате отсутствующие значения на 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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...