Заполните данные отсутствующих дат нолем при объединении - PullRequest
0 голосов
/ 29 августа 2018
import pandas as pd
import numpy as np

one = pd.read_csv('data1.csv')
two = pd.read_csv('data2.csv')

я так написал коды, а один показывает

A    Date
10    2011-01-03
20    2011-01-04
10    2011-01-06
20    2011-01-07
30    2011-01-10
40    2011-01-13
25    2011-01-15
・
・
・

два концерта

B    Date
15    2011-01-01
15    2011-01-02
15    2011-01-03
25    2011-01-07
35    2011-01-10
10    2011-01-13
25    2011-01-15
・
・
・

Я хочу поставить 0 в данные отсутствующей даты, когда фрейм данных помечен. Теперь я написал коды

one_and_two = pd.merge(one, two, on='Date', how='inner')
print(one_and_two)

и бегите, one_and_two is

    A        Date    B
0  10  2011-01-03  15
1  20  2011-01-07  25
2  30  2011-01-10  35
3  40  2011-01-13  10
4  25  2011-01-15  25
・
・
・

Идеальный вывод

    A        Date    B
0  0  2011-01-01  15
1  0  2011-01-02  15
2  10  2011-01-03  15
3  20  2011-01-04  0
4  0  2011-01-05  0
5  10  2011-01-06  0
6  20  2011-01-07  25
7  0  2011-01-08  0
8  0  2011-01-09  0
9  30  2011-01-10  35
・
・
・

Датафрейм имеет 2011-01-01 〜2011-12-31, Я хочу поставить 0 в данные отсутствующей даты, но как я могу это сделать? Что не так в моих кодах?

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Используйте внешнее объединение, чтобы захватить все даты, переиндексировать диапазон между минимальной и максимальной датами, чтобы захватить все даты в диапазоне, заполнить нулевые значения нулем, а затем, наконец, сбросить индекс даты и переставить в нужном порядке ( A, Date, B).

one_and_two = (
    pd.merge(one, two, on='Date', how='outer')
    .set_index('Date')
    .reindex(
        pd.DatetimeIndex(
            start=one_and_two.index.min(),
            end=one_and_two.index.max(),
            freq='D',
            name='Date'))
    .fillna(0)
    .reset_index()
    [['A', 'Date', 'B']]
)
>>> one_and_two
     A       Date   B
0    0 2011-01-01  15
1    0 2011-01-02  15
2   10 2011-01-03  15
3   20 2011-01-04   0
4    0 2011-01-05   0
5   10 2011-01-06   0
6   20 2011-01-07  25
7    0 2011-01-08   0
8    0 2011-01-09   0
9   30 2011-01-10  35
10   0 2011-01-11   0
11   0 2011-01-12   0
12  40 2011-01-13  10
13   0 2011-01-14   0
14  25 2011-01-15  25
0 голосов
/ 29 августа 2018

Использовать внешнее объединение с 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']))

Или по минимальным и максимальным датам:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...