2015-08-12 2 views
2

У меня есть две панды DataFrames:Регистрация DateTimes из DataFrames вперед и заполнения данных

DataFrame a

2013-03-25 13:15:00  1 
2013-03-26 13:15:00  2 
2013-03-28 13:15:00  4 
2013-03-29 13:15:00  5 

и DataFrame b

2013-03-25 13:15:00 25 
2013-03-27 13:15:00 15 
2013-03-28 13:15:00  5 
2013-03-29 13:15:00 10 

Я пытаюсь присоединиться даты и вперед заливку ценности. Сейчас я делаю это так:

ab = pd.concat([a, b], axis=1) 
ab.fillna(method='ffill', inplace=True) 

a = ab.ix[:,0] 
b = ab.ix[:,1] 

Так, ab является

2013-03-25 13:15:00  1 25 
2013-03-26 13:15:00  2 NaN 
2013-03-27 13:15:00 NaN 15 
2013-03-28 13:15:00  4  5 
2013-03-29 13:15:00  5 10 

, а затем

2013-03-25 13:15:00  1 25 
2013-03-26 13:15:00  2 25 
2013-03-27 13:15:00  2 15 
2013-03-28 13:15:00  4  5 
2013-03-29 13:15:00  5 10 

Это имеет два недостатка. Во-первых, a и b теперь являются сериями. Во-вторых, это решение не будет работать для многоканальных DataFrames. Можно ли сделать это только для a и bна месте без переезда через ab. Это похоже на довольно стандартный процесс. Что мне не хватает?

Edit:

a.info() 
<class 'pandas.core.frame.DataFrame'> 
DatetimeIndex: 4 entries, 2013-03-25 13:15:00 to 2013-03-29 13:15:00 
Data columns (total 1 columns): 
icap 4 non-null float64 
dtypes: float64(1) 
memory usage: 64.0 bytes 

b эквивалентно.

+1

Извините, вы хотите внешнее слияние: 'a.merge (b, how = 'outer'). Ffill()'? Я не знаю, являются ли даты вашим индексом или столбцом, вам нужно прояснить это. – EdChum

+0

Что вернет рамку данных с двумя столбцами? Я хочу, чтобы 'a' и' b' были изменены. – joachim

+1

Итак, вы хотите 'a.combine_first (b) .ffill()'? Также вы не ответили на вопрос о том, что такое ваша структура df, можете ли вы публиковать 'a.info()' и 'b.info()', спасибо – EdChum

ответ

0

Одно простое решение, чтобы изменить два DataFrames a и b в желаемом направлении без слияния или присоединения к ним будет использовать их индекс ,

index_joined = a.index 
index_joined = index_joined.union(b.index) 
a.reindex(index=index_joined, method='ffill') 
b.reindex(index=index_joined, method='ffill') 
2

Я думаю, в вашем случае, используя combine_first в сочетании с ffill даст вам то, что вы хотите:

In [46]: 
a.combine_first(b).ffill() 

Out[46]: 
        a b 
index      
2013-03-25 13:15:00 1 25 
2013-03-26 13:15:00 2 25 
2013-03-27 13:15:00 2 15 
2013-03-28 13:15:00 4 5 
2013-03-29 13:15:00 5 10 

Это присоединится и выравнивать по индексам, берущих объединение обоих ДФС, это будет ввести NaN значения, которые вы можете заполнить с помощью ffill

из результата выше, вы можете просто присвоить обратно COLS интересов, и это выглядит как то, что вы действительно хотите, чтобы индексировать, используя объединение индексов:

In [48]: 
a.reindex(a.index.union(b.index)).ffill() 

Out[48]: 
        a 
index     
2013-03-25 13:15:00 1 
2013-03-26 13:15:00 2 
2013-03-27 13:15:00 2 
2013-03-28 13:15:00 4 
2013-03-29 13:15:00 5 

Таким образом, вы можете сделать это для обоих ДФС без необходимости выполнения каких-либо слияния/объединения

Смежные вопросы