Почему, когда я использую stack (), количество строк увеличивается? - PullRequest
0 голосов
/ 17 марта 2020

Я попытался объединить два столбца, начинающихся и заканчивающихся в Flag и Timestamp с этим фрагментом кода:

print(df_DisponibilityAlarm.shape)

df_DisponibilityAlarm = (df_DisponibilityAlarm.stack()
 .rename_axis([None, 'Flag'])
 .reset_index(level=1, name='Timestamp'))

print(df_DisponibilityAlarm.shape)

Результат:

                         begin                          end
0                          NaN  2019-10-21  07:48:28.272688
1                          NaN  2019-10-21  07:48:28.449916
2  2019-10-21  07:48:26.740378                          NaN
3  2019-10-21  07:48:26.923764                          NaN
4                          NaN  2019-10-21  07:48:41.689466
5  2019-10-21  07:48:37.306045                          NaN
6                          NaN  2019-10-21  07:58:00.774449
7  2019-10-21  07:57:59.223986                          NaN
8                          NaN  2019-10-21  08:32:37.004455
9  2019-10-21  08:32:35.755252                          NaN

(13129, 2)
(13140, 2)

    Flag                    Timestamp
0    end  2019-10-21  07:48:28.272688
1    end  2019-10-21  07:48:28.449916
2  begin  2019-10-21  07:48:26.740378
3  begin  2019-10-21  07:48:26.923764
4    end  2019-10-21  07:48:41.689466
5  begin  2019-10-21  07:48:37.306045
6    end  2019-10-21  07:58:00.774449
7  begin  2019-10-21  07:57:59.223986
8    end  2019-10-21  08:32:37.004455
9  begin  2019-10-21  08:32:35.755252

Это работает! Но когда я посмотрел внимательно, я вижу, когда я использую "stack ()", количество строк увеличивается ... Я не понимаю, почему, не могли бы вы объяснить, пожалуйста? Мне нужно это, чтобы подтвердить мою начальную гипотезу.

1 Ответ

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

EDITED

По сути, функция stack() делает ваш набор данных длиннее НО , как вы можете видеть в примере распечатки:

строк, содержащих NaN не включаются после суммирования. <------------- </p>


Рассмотрим приведенный ниже тестовый пример, добавлено TEST_VALUE:

begin,end
NaN,2019-10-21  07:48:28.272688
NaN,2019-10-21  07:48:28.449916
2019-10-21  07:48:26.740378,NaN
2019-10-21  07:48:26.923764,NaN
NaN,2019-10-21  07:48:41.689466
2019-10-21  07:48:37.306045,TEST_VALUE
NaN,2019-10-21  07:58:00.774449
2019-10-21  07:57:59.223986,NaN
NaN,2019-10-21  08:32:37.004455
2019-10-21  08:32:35.755252,NaN

df = pd.read_clipboard(sep=',') 

print(df.shape)
print(df.stack().shape)
print(df.stack())

(10, 2)
(11, )
0  end      2019-10-21  07:48:28.272688
1  end      2019-10-21  07:48:28.449916
2  begin    2019-10-21  07:48:26.740378
3  begin    2019-10-21  07:48:26.923764
4  end      2019-10-21  07:48:41.689466
5  begin    2019-10-21  07:48:37.306045
   end                       TEST_VALUE
6  end      2019-10-21  07:58:00.774449
7  begin    2019-10-21  07:57:59.223986
8  end      2019-10-21  08:32:37.004455
9  begin    2019-10-21  08:32:35.755252

# this part is strange
print(df.stack()[5])
begin    2019-10-21  07:48:37.306045
end                       TEST_VALUE
dtype: object

Довольно странно, как индекс 5 по сравнению с остальными, и у меня нет ответа на вопрос, почему это тип мультииндекса, а остальные в Серии нет, но давайте продолжим ...

Как вы можете видеть, это добавило дополнительную строку для TEST_VALUE, и ОПЯТЬ любое значение с NaN не входит в составную версию.

Я бы " стандартизировать "или убедитесь, что ваши данные содержат либо NaN или дату, либо заполните NaN другим значением, используя fillna().

Если вы хотите сохранить ваши данные такими, какие они есть, вы также можете обработать данные порциями до нуля на ГДЕ (в моем примере это TEST_VALUE), данные не являются в форме примерно так:

# read df in as an iterator with chunks

df1 = pd.read_clipboard(
                    sep=',', 
                    chunksize=3  # change this to whatever chunksize you need
)

def test_chunks(df_iterator):
    """
    Function that compares original df chunk size shape to stacked chunksize shape
    Returns: original chunk where there is a mismatch in shapes
    """
    for df_chunk in df_iterator:
        original = df_chunk.shape[0]
        stacked = df_chunk.stack().shape[0]
        if original != stacked:
            return df_chunk

bad_chunk = test_chunks(df1)
print(bad_chunk)

                         begin                          end
3  2019-10-21  07:48:26.923764                          NaN
4                          NaN  2019-10-21  07:48:41.689466
5  2019-10-21  07:48:37.306045                   TEST_VALUE

Итак, хотя я не могу быть уверен, потому что у меня нет доступа к вашим полным данным, мой вердикт состоит в том, что это проблема единообразия данных.

Я надеюсь, что это полезно.

...