Изменение формы и фильтра данных в пандах - PullRequest
0 голосов
/ 28 декабря 2018

Я хотел бы отфильтровать все значения из приведенного ниже кадра данных (df1) с ячейками, равными 1, и создать новый кадр данных, в котором каждая строка имеет строку и столбец из соответствующей ячейки (как в df2 ниже):

dict1 = [{'12/21/18': 0,'12/22/18': 0,'12/23/18': 1,'12/24/18': 1},
     {'12/21/18': 1,'12/22/18': 1,'12/23/18': 0,'12/24/18': 1},
     {'12/21/18': 0,'12/22/18': 1,'12/23/18': 0,'12/24/18': 0},
     {'12/21/18': 1,'12/22/18': 0,'12/23/18': 1,'12/24/18': 1}]


df1 = pd.DataFrame(dict1, index= ['AAPL','CSCO','GE','MSFT' ])

dict2 = [{'Ticker': 'AAPL','Date': '12/23/18'},
     {'Ticker': 'AAPL','Date': '12/24/18'},
     {'Ticker': 'CSCO','Date': '12/22/18'},
     {'Ticker': 'CSCO','Date': '12/24/18'},
     {'Ticker': 'GE',  'Date': '12/22/18'},
     {'Ticker': 'MSFT','Date': '12/24/18'}]


df2 = pd.DataFrame(dict2)

Может кто-нибудь предложить подход, как это сделать?

Ответы [ 3 ]

0 голосов
/ 28 декабря 2018

Я думаю, что самый простой способ сделать это заключается в следующем:

df1.index.name = 'Ticker' # First reset the name so it will match your desired output (default is 'index')
df2 = df1.reset_index().melt(id_vars='Ticker',var_name='Date') # This unstacks the data

Наконец, чтобы получить его в нужной форме, мы удаляем 0, сбрасываем индекс и сортируем:

df2 = df2[df2.value == 1].set_index('Ticker').filter(['Date','Ticker']).sort_index()
0 голосов
/ 28 декабря 2018

Вот сравнение производительности методов, данных @slayer и @Lucas H. Я также добавил третий подход.

@slayer method 
%%timeit 
1.12 ms ± 61.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

@Lucas H method
%%timeit
5.16 ms ± 735 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

@Third method
%%timeit
4.4 ms ± 232 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)


# Third method
df1 = df1.T
df2 = pd.melt(df1.where(df1==0, df1.index))
df2 = df2[df2.value != 0]
df2.columns = ['Ticker', 'Date']

Очевидно, что метод @ slayer превосходит все.

0 голосов
/ 28 декабря 2018

Вы можете попытаться просмотреть значения фрейма данных и получить массив индексов, значение которого больше 0. Затем вы можете использовать индексы в списках индексов и имен столбцов для создания нового фрейма данных.

import numpy as np
idx = np.argwhere(df1.values > 0)

# Get a list of the ticker index and column names
ticker_list = df1.index.tolist()
date_list = df1.columns.tolist()
ticker = []
date = []

for value in idx:
    ticker.append(ticker_list[value[0]])
    date.append(date_list[value[1]])

df2 = pd.DataFrame({'Ticker': ticker, 'Date': date})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...