Pandas Groupby с Agg Мин / Макс дата - PullRequest
0 голосов
/ 24 сентября 2018

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

Я пробовал такие вещи, как '', "NaN", True, False, 0 и т. Д. ...

Сначала я устанавливаю 'p_date' и 's_date' из фактической даты, основываясь на действии '+' или '-'.

 df_td [ 'p_date' ] = np.where ( df_td.action == '+', df_td.date, ??? )
 df_td [ 's_date' ] = np.where ( df_td.action == '-', df_td.date, ??? )

Так что мне нужен минимумp_date & max s_date здесь.

  issue      p_date      s_date
0  issue  2012-11-01            
1  issue  2013-12-09            
2  issue  2014-12-08            
3  issue              2016-01-13
4  issue  2012-11-01            
5  issue              2014-03-26
6  issue              2015-05-29
7  issue  2013-12-18            
8  issue              2016-01-13

Я делаю группу по

g = df_td.groupby ( [ 'name', 'type' ], as_index = False ).agg (
     {  ...
        'p_date': 'min',
        's_date': 'max'
      } )

Это дает мне следующую ошибку.

'<=' not supported between instances of 'datetime.date' and 'str'

, если я сделаюдо даты для пробела, она работает, но это не очень хороший вариант.

Чем можно заполнить дату, чтобы она заработала?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

В пандах NaN используется в качестве пропущенного значения и игнорируется для большинства операций, поэтому оно является правильным для использования.Если вы по-прежнему получаете сообщение об ошибке, возможно, это связано с тем, что у вас есть datetime.date (ну, вы определенно получили это, я имею в виду, что это, вероятно, вызывает проблемы).

Например,, если ваши пропущенные значения "" и dtypes столбца object с внутренними типами datetime.date, я получу:

In [496]: df.groupby("issue").agg({"p_date": "min", "s_date": "max"})
[...]
TypeError: '<=' not supported between instances of 'datetime.date' and 'str'

, но если я переключусь на родные для панд объекты времени и NaN,это работает:

In [500]: df["p_date"] = pd.to_datetime(df["p_date"])

In [501]: df["s_date"] = pd.to_datetime(df["s_date"])

In [502]: df
Out[502]: 
   issue     p_date     s_date
0  issue 2012-11-01        NaT
1  issue 2013-12-09        NaT
2  issue 2014-12-08        NaT
3  issue        NaT 2016-01-13
4  issue 2012-11-01        NaT
5  issue        NaT 2014-03-26
6  issue        NaT 2015-05-29
7  issue 2013-12-18        NaT
8  issue        NaT 2016-01-13

In [503]: df.groupby("issue").agg({"p_date": "min", "s_date": "max"})
Out[503]: 
          p_date     s_date
issue                      
issue 2012-11-01 2016-01-13
0 голосов
/ 24 сентября 2018

Я не доволен своим ответом, но, похоже, он работает.

Я создал пол и потолок даты.

floor = datetime.date ( 1900, 1, 1 )
ceil = datetime.date ( 2100, 1, 1 )

df_td [ 'p_date' ] = np.where ( df_td.action == '+', df_td.date, ceil )
df_td [ 's_date' ] = np.where ( df_td.action == '-', df_td.date, floor )

Таким образом, они будут компенсировать агрегатную функцию min / max.которым нужен объект данных для работы.

все еще хотел бы более подходящее предложение.Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...