Как сделать равными длину значений и индекса при применении функции к мультииндексному фрейму данных? - PullRequest
1 голос
/ 10 мая 2019

Предположим, я создаю мультииндексный фрейм данных, например, так:

import pandas as pd

date_index = pd.date_range(start='1/1/2019', end='1/3/2019')
symbol_index = ['AAPL','BOA','GE','MSFT']
idx = pd.MultiIndex.from_product([date_index, symbol_index], names=['Date', 'Symbol'])
col = ['val_to_change','new_val']
data = pd.DataFrame(index=idx,columns=col)

Я хочу сделать несколько вычислений строка за строкой, например:

initial_variable = 0

def calc(row):
    global initial_variable
    row['val_to_change'] = initial_variable
    #I make further calculations here with row['val_to_change']
    row['new_val'] = row['val_to_change'] + 500
    initial_variable = row['new_val'].values
    return row

data = data.groupby('Date').apply(calc)

Это даст мне желаемый результат:

                   val_to_change  new_val
Date       Symbol                        
2019-01-01 AAPL                0      500
           BOA                 0      500
           GE                  0      500
           MSFT                0      500
2019-01-02 AAPL              500     1000
           BOA               500     1000
           GE                500     1000
           MSFT              500     1000
2019-01-03 AAPL             1000     1500
           BOA              1000     1500
           GE               1000     1500
           MSFT             1000     1500

Однако, если в кадре данных нет одинакового количества индекса уровня Symbol для каждого индекса Date, я получаю сообщение об ошибке для вышеуказанной функции.Если я опускаю Symbol из Date:

data.drop(('2019-01-01','AAPL'),inplace=True)

, а теперь применяю ту же функцию к data, тогда я получаю ошибку:

ValueError: Length of values does not match length of index

, потому чтоПервый индекс Date имеет только 3 Symbol индекса.Как я могу преодолеть эту проблему?Я хочу применить такую ​​функцию к моему фрейму данных, который имеет мультииндекс, но мультииндекс не имеет одинаковое количество Symbol индекса для каждого Date индекса.

1 Ответ

1 голос
/ 10 мая 2019

Используйте DataFrame.unstack с DataFrame.stack и параметром dropna=False, чтобы избежать отбрасывания новых пропущенных строк, заполненных NaN s:

data.drop(('2019-01-01','AAPL'),inplace=True)

data = data.unstack().stack(dropna=False)
data = data.groupby('Date').apply(calc)
print (data)
                   val_to_change  new_val
Date       Symbol                        
2019-01-01 AAPL                0      500
           BOA                 0      500
           GE                  0      500
           MSFT                0      500
2019-01-02 AAPL              500     1000
           BOA               500     1000
           GE                500     1000
           MSFT              500     1000
2019-01-03 AAPL             1000     1500
           BOA              1000     1500
           GE               1000     1500
           MSFT             1000     1500
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...