Присоединение Pandas таблиц и сохранение значений NaN, если даты равны нулю - PullRequest
1 голос
/ 27 марта 2020

Допустим, у меня есть несколько данных о ценах на акции с разными датами. Всего есть 100 дат по всем акциям. Если у меня есть 10 акций, каждая с датами <100, я хотел бы получить окончательный фрейм данных, в котором каждая акция имеет 100 дат, в общем, фрейм данных имеет 10 * 100 строк = 1000 строк, дату, в которую акция делает не иметь, это должен быть ряд с NaN. </p>

df1
        date ticker      open      high       low     close  volume
0 2007-01-03   0001  0.133293  0.133293  0.133293  0.133293    40.0
1 2007-01-04   0001  0.133293  0.133293  0.133293  0.133293     0.0
2 2007-01-05   0001  0.133293  0.133293  0.128697  0.133293   215.0

df2
        date ticker      open      high       low     close  volume
0 2007-01-01   0002  0.111111  0.111111  0.111111  0.111111    11.1
1 2007-01-02   0002  0.111111  0.111111  0.111111  0.111111    11.1
2 2007-01-04   0002  0.111111  0.111111  0.111111  0.111111    11.1

, что приводит к df

df1
        date ticker      open      high       low     close  volume
0 2007-01-01   0001       NaN       NaN       NaN       NaN     NaN  
1 2007-01-02   0001       NaN       NaN       NaN       NaN     NaN 
2 2007-01-03   0001  0.133293  0.133293  0.133293  0.133293    40.0
3 2007-01-04   0001  0.133293  0.133293  0.133293  0.133293     0.0
4 2007-01-05   0001  0.133293  0.133293  0.128697  0.133293   215.0
5 2007-01-01   0002  0.111111  0.111111  0.111111  0.111111    11.1
6 2007-01-02   0002  0.111111  0.111111  0.111111  0.111111    11.1
7 2007-01-03   0002       NaN       NaN       NaN       NaN     NaN
8 2007-01-04   0002  0.111111  0.111111  0.111111  0.111111    11.1
9 2007-01-05   0002       NaN       NaN       NaN       NaN     NaN

Ответы [ 2 ]

1 голос
/ 27 марта 2020

вы сначала concat свои кадры данных, затем set_index дата и тикер, reindex со значением MultiIndex.from_product со значением unique из обоих столбцов и reset_index

df_f = pd.concat([df1,df2], axis=0)
df_f = df_f.set_index(['date','ticker'])\
           .reindex(pd.MultiIndex.from_product([df_f['date'].unique(), df_f['ticker'].unique()], 
                                                names=['date','ticker']))\
           .reset_index()#.sort_values(['ticker', 'date'])

print (df_f)
         date  ticker      open      high       low     close  volume
0  2007-01-03       1  0.133293  0.133293  0.133293  0.133293    40.0
1  2007-01-03       2       NaN       NaN       NaN       NaN     NaN
2  2007-01-04       1  0.133293  0.133293  0.133293  0.133293     0.0
3  2007-01-04       2  0.111111  0.111111  0.111111  0.111111    11.1
4  2007-01-05       1  0.133293  0.133293  0.128697  0.133293   215.0
5  2007-01-05       2       NaN       NaN       NaN       NaN     NaN
6  2007-01-01       1       NaN       NaN       NaN       NaN     NaN
7  2007-01-01       2  0.111111  0.111111  0.111111  0.111111    11.1
8  2007-01-02       1       NaN       NaN       NaN       NaN     NaN
9  2007-01-02       2  0.111111  0.111111  0.111111  0.111111    11.1

вы можете sort_values после того, как вы захотите отсортировать результат

1 голос
/ 27 марта 2020

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

dfs = [df1, df2]

df = pd.concat(dfs, ignore_index=True)
df['date'] = pd.to_datetime(df['date'], infer_datetime_format=True)
date_range = pd.date_range(df['date'].min(), df['date'].max(), freq='D')

df = (
    df.set_index('date')
    .groupby('ticker').apply(lambda x: x.reindex(date_range))
    .reset_index(level=0, drop=True)
    .reset_index()
    .rename(columns={'index':'date'})
)

        date  ticker      open      high       low     close  volume
0 2007-01-01     NaN       NaN       NaN       NaN       NaN     NaN
1 2007-01-02     NaN       NaN       NaN       NaN       NaN     NaN
2 2007-01-03     1.0  0.133293  0.133293  0.133293  0.133293    40.0
3 2007-01-04     1.0  0.133293  0.133293  0.133293  0.133293     0.0
4 2007-01-05     1.0  0.133293  0.133293  0.128697  0.133293   215.0
5 2007-01-01     2.0  0.111111  0.111111  0.111111  0.111111    11.1
6 2007-01-02     2.0  0.111111  0.111111  0.111111  0.111111    11.1
7 2007-01-03     NaN       NaN       NaN       NaN       NaN     NaN
8 2007-01-04     2.0  0.111111  0.111111  0.111111  0.111111    11.1
9 2007-01-05     NaN       NaN       NaN       NaN       NaN     NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...