Как перенести значения строки даты в заголовки столбцов и ввести столбцы для дат НЕ во входных данных? - PullRequest
1 голос
/ 26 мая 2020

Я пытаюсь:

  1. Транспонировать список дат в столбцы
  2. Ввести столбцы для дат, которые явно не указаны в данных (например, в этом случае 07.03.2020 )

Я написал следующий код (формат даты = дд / мм / гггг):

import pandas as pd
from io import StringIO

data = '''\
item|date
ABC1|02/07/2020
ABC1|05/07/2020
ABC1|06/07/2020
DEF2|04/07/2020
DEF2|05/07/2020'''

df = pd.read_csv(StringIO(data), sep='|', parse_dates=['date'])

df = pd.get_dummies(df.set_index(['item'])['date']).groupby(level=[0]).max().reset_index()

print(df)

Мой код возвращает:

+------+------------+------------+------------+------------+
| item | 02/07/2020 | 04/07/2020 | 05/07/2020 | 06/07/2020 |
+------+------------+------------+------------+------------+
| ABC1 |          1 |          0 |          1 |          1 |
| DEF2 |          0 |          1 |          1 |          0 |
+------+------------+------------+------------+------------+

Это отметает первый бит, но у меня очень мало идей о том, как достичь sh второй цели. Я подозреваю, что мне нужно начать с минимальной и максимальной дат из ввода, а затем построить из них список столбцов.

К сожалению, я не знаю, с чего начать.

Желаемые результаты следующим образом (обратите внимание, что есть столбец за 3 июля):

**Matrix 1**
+------+------------+------------+------------+------------+------------+
| item | 02/07/2020 | 03/07/2020 | 04/07/2020 | 05/07/2020 | 06/07/2020 |
+------+------------+------------+------------+------------+------------+
| ABC1 |          1 |            |            |          1 |          1 |
| DEF2 |            |            |          1 |          1 |            |
+------+------------+------------+------------+------------+------------+

**Matrix 2 (Inverse of matrix 1)**
+------+------------+------------+------------+------------+------------+
| item | 02/07/2020 | 03/07/2020 | 04/07/2020 | 05/07/2020 | 06/07/2020 |
+------+------------+------------+------------+------------+------------+
| ABC1 |            |          1 |          1 |            |            |
| DEF2 |          1 |          1 |            |            |          1 |
+------+------------+------------+------------+------------+------------+

Я надеюсь, что это возможно и что я предоставил достаточно информации

Спасибо

Ответы [ 2 ]

1 голос
/ 26 мая 2020

IIU C, вам также понадобится reindex:

df['date'] = pd.to_datetime(df.date, dayfirst=True)

new_range = pd.date_range(df.date.min(), df.date.max(), freq='D')

ret = pd.crosstab(df.item,df.date).reindex(new_range, fill_value=0, axis=1)

Другой вариант - использовать as_freq:

pd.crosstab(df.date,df.item).asfreq('D',fill_value=0).T

Вывод:

      2020-07-02  2020-07-03  2020-07-04  2020-07-05  2020-07-06
item                                                            
ABC1           1           0           0           1           1
DEF2           0           0           1           1           0
0 голосов
/ 26 мая 2020

Вы можете использовать dayfirst при чтении csv с учетом формата, а затем при необходимости переиндексировать с помощью replace 0 с NaN:

df = pd.read_csv(StringIO(data), sep='|', parse_dates=['date'],dayfirst=True)

dt_rng = pd.date_range(df['date'].min(),df['date'].max())

df1 = (pd.get_dummies(df.set_index(['item'])['date']).max(level=0)
       .reindex(dt_rng,axis=1).replace(0,np.nan).reset_index())

df2 = df1.isna().astype(int).replace(0,np.nan)

print('df1','\n',df1,'\n','df2','\n',df2)
    df1 
    item  2020-07-02 00:00:00  2020-07-03 00:00:00  2020-07-04 00:00:00  \
0  ABC1                  1.0                  NaN                  NaN   
1  DEF2                  NaN                  NaN                  1.0   

   2020-07-05 00:00:00  2020-07-06 00:00:00  
0                    1                  1.0  
1                    1                  NaN   
 df2 
    item  2020-07-02 00:00:00  2020-07-03 00:00:00  2020-07-04 00:00:00  \
0   NaN                  NaN                    1                  1.0   
1   NaN                  1.0                    1                  NaN   

   2020-07-05 00:00:00  2020-07-06 00:00:00  
0                  NaN                  NaN  
1                  NaN                  1.0  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...