Сравнение двух дат в сгруппированной переменной - PullRequest
0 голосов
/ 08 февраля 2019

Я пытаюсь сравнить две даты, но получаю сообщение об ошибке «Можно сравнивать только объекты Series с одинаковыми метками». Я также пытался использовать iloc и .values, так как некоторые другие ответы были получены с использованием этого метода, но я получал различные другие ошибки с использованием этого метода.,Я не уверен что делать.Проблема в том, что я пишу:

 elif group[1]["dtstart"] <= endDate

Ниже приведен мой полный пример кода.

Обратите внимание, что это не фактические данные, с которыми я работаю, я попытался сделать их очень похожими.Я по-прежнему получаю одну и ту же ошибку для обоих (могу сравнивать только идентично помеченные объекты Series),

НО, когда я включаю значения .value в этом коде (с поддельными данными) в этот раздел, например group[1]["dtstart"] <= endDate.values Iполучить ошибку: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). Когда я включаю .value в том же месте в реальных данных, я получаю ошибку: «Длина должна совпадать, чтобы сравнить», именно поэтому я попытался iloc и до сих пор не удалось.Я даже не уверен, что iloc или .values ​​- это то, что нужно, и фальшивые данные и реальные данные не выдают одинаковую ошибку, когда я включаю либо один, но просто сохранение всего, что есть, выдает одинаковую ошибку как в фальшивом, так и в фальшивомreal, равный

«Может сравнивать только идентично помеченные объекты Series»

Любая помощь приветствуется.Спасибо!

import pandas as pd
from datetime import datetime
import numpy as np

pd.set_option('display.max_columns', None)
#Create a DataFrame
d = {
    'ID':[1,2,3,3,1,1,2,2,4,4],
   'dtstart':[pd.Timestamp('2018-01-01'), pd.Timestamp('2018-01-30'), pd.Timestamp('2018-03-01'), pd.Timestamp('2018-03-14'),
               pd.Timestamp('2018-04-08'), pd.Timestamp('2018-04-27'), pd.Timestamp('2018-07-03'), pd.Timestamp('2018-07-17'),pd.Timestamp('2018-07-17'),pd.Timestamp('2018-01-20')],
   'dtend':[pd.Timestamp('2018-01-06'), pd.Timestamp('2018-02-15'), pd.Timestamp('2018-03-05'), pd.Timestamp('2018-03-22'),
               pd.Timestamp('2018-04-15'), pd.Timestamp('2018-05-06'), pd.Timestamp('2018-07-07'), pd.Timestamp('2018-07-28'),pd.Timestamp('2018-01-18'),pd.Timestamp('2018-01-22')]}
df = pd.DataFrame(d)

grouped = df.groupby(['ID'])
grouped.apply(lambda _df: _df.sort_values(by=['dtstart']))
count=0
df_CE = pd.DataFrame(columns=['ID', 'dtstart', 'dtEnd'])
for group in grouped:
    months_enrolled=len(group)
    if count == 0:
        print("group[1][dtstart]===",group[1]["dtstart"])

        startDate = group[1]["dtstart"]
        endDate   = group[1]["dtend"] 
        count += 1
#    print("endDate==",TEST_endDate.dtypes)
    elif group[1]["dtstart"] <= endDate:
        print("yes")

1 Ответ

0 голосов
/ 09 февраля 2019

Вы никогда не устанавливаете grouped.apply(lambda _df: _df.sort_values(by=['dtstart'])) на что-либо.Если вы хотите отсортировать и сохранить его как отсортированный, то вы должны изменить его на

grouped = grouped.apply(lambda _df: _df.sort_values(by=['dtstart']))

, что делает grouped мультииндексированным DataFrame, и вам нужно будет выполнить итерацию как таковую.Предполагая, что вы не хотите этого делать, вы получаете ошибку, потому что вы сравниваете два pd.Series разной длины.Я запустил ваш код, и в строке, где вы получили эту ошибку, было проведено сравнение между

(4,    ID      dtend    dtstart
8   4 2018-01-18 2018-07-17
9   4 2018-01-22 2018-01-20)
>>> g2
(2,    ID      dtend    dtstart
1   2 2018-02-15 2018-01-30
6   2 2018-07-07 2018-07-03
7   2 2018-07-28 2018-07-17)
...