Вопрос:

Вставка строк в Pandas с помощью переиндексации в MultiIndex DataFrame

python pandas dataframe indexing

127 просмотра

1 ответ

173 Репутация автора

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

Например:

                       tradeDate   assetId  ticker    Sedol      price
0        2016-01-04 00:00:00.000      1786    3900  B17N9P6        1   
1        2016-01-04 00:00:00.000      2041    1898  B1JNK84        2   
2        2016-01-04 00:00:00.000      2981    CBMG  B9F9PM1        3   
3        2016-01-04 00:00:00.000      3547     MWA  B15RZR4        4   
4        2016-01-04 00:00:00.000      3570    TPLM  B065Y40        5   
5        2016-01-05 00:00:00.000      3995    MHGC  B0YRYS2        1   
6        2016-01-05 00:00:00.000      4110     DSW  B0BV2V6        2   
7        2016-01-05 00:00:00.000      4874     NWE  B03PGL4        3   
8        2016-01-05 00:00:00.000      4982    BOFI  B0637D4        4   
9        2016-01-05 00:00:00.000      5082   ISCTR  B03MYS8        5   
10       2016-01-05 00:00:00.000      5083   KCHOL  B03MVJ8        6

так что мне нужно сделать, это индекс по tradeDate и assetIds, а затем переиндексировать, чтобы он создавал новые строки для каждой сделки, чтобы всегда было одинаковое количество assetIds. Это создаст строки с NaNs. Я смущен этим шагом, потому что я не уверен, синтаксис при использовании нескольких индексов и когда столбцы tradeDate и assetId точно не совпадают.

Наконец, мне придется заменить NaN последним доступным значением. Однако снова я должен сделать это для обоих индексов для tradeDate и assetId. Оцените помощь по этому

Автор: Dick Thompson Источник Размещён: 08.11.2017 11:54

Ответы (1)


1 плюс

11 Репутация автора

TomAugspurger ответил на первую часть вашего вопроса здесь .

По сути, вам нужно использовать умный трюк, который состоит из настройки Multiindex, разборки фрейма данных, заполнения недостающих значений и их повторной укладки. Затем вы должны снова преобразовать заполненные пропущенные значения в NaN и использовать .fillna()метод, реализованный в pandas method='ffill', чтобы заменить NaN последним доступным значением.

Во-первых, давайте сгенерируем данные, которые нам нужны:

import pandas as pd
import numpy as np

data =  [['2016-01-04 00:00:00.000', 1786, '3900', 'B17N9P6', 1],
['2016-01-04 00:00:00.000', 2041, '1898', 'B1JNK84', 2],
['2016-01-04 00:00:00.000', 2981, 'CBMG', 'B9F9PM1', 3],
['2016-01-04 00:00:00.000', 3547, 'MWA', 'B15RZR4', 4],
['2016-01-04 00:00:00.000', 3570, 'TPLM', 'B065Y40', 5],
['2016-01-05 00:00:00.000', 3995, 'MHGC', 'B0YRYS2', 1],
['2016-01-05 00:00:00.000', 4110, 'DSW', 'B0BV2V6', 2],
['2016-01-05 00:00:00.000', 4874, 'NWE', 'B03PGL4', 3],
['2016-01-05 00:00:00.000', 4982, 'BOFI', 'B0637D4', 4],
['2016-01-05 00:00:00.000', 5082, 'ISCTR', 'B03MYS8', 5],
['2016-01-05 00:00:00.000', 5083, 'KCHOL', 'B03MVJ8', 6]]

cols  = ['tradeDate','assetId','ticker','Sedol','price']

Тогда для решения проблемы:

df = pd.DataFrame.from_records(data, columns=cols)

# I used `-1` to fill the empty values, but use whatever value
# does not occur in the dataset
df = df.set_index(['tradeDate', 'assetId']).unstack().fillna(-1).stack()

# Once you have the data frame stacked again, you need to
# convert unknown values to np.nan again
df.replace(-1, np.nan, inplace=True)

# Fill with latest value for given assetId
df = df.groupby(level=['assetId']).fillna(method='ffill')

Надеюсь, что этот ответ охватывает ваш вопрос, дайте нам знать иначе.

Автор: Roni Chikhmous Размещён: 09.11.2017 11:30
Вопросы из категории :
32x32