Получить индексы строк с последовательными значениями 0 из большого Pandas DataFrame - PullRequest
0 голосов
/ 09 июля 2019

У меня есть набор данных, который содержит потребление энергии за полчаса. Я пытаюсь получить списки индексов строк, которые не потребляют энергию в течение длительного периода времени. Другими словами, я пытаюсь получить список индексов, которые содержат последовательные значения 0 в определенном столбце. Я использую следующий код, и некоторое время он работает нормально, но затем он начинает добавлять списки индексов, которые не равны 0.

import more_itertools as mit

indices = df.loc[df[df.columns[2]] == df[df.columns[2]].isnull()].index.values.tolist()
outages_indices = [list(group) for group in mit.consecutive_groups(indices)]
long_outages_indices = []
for i in outages_indices:
    if len(i) >= 8:
        long_outages_indices.append(i)

Например, в строке 849246 значение действительно равно 0, а в строке 1543677 - 0,105, но оно все еще является частью списка.

Первые несколько строк кадра данных:

LCLid            tstp                           energy(kWh/hh)
MAC000002        2012-10-12 00:30:00.0000000    0.0
MAC000002        2012-10-12 01:00:00.0000000    0.0
MAC000002        2012-10-12 01:30:00.0000000    0.0
MAC000002        2012-10-12 02:00:00.0000000    0.0
MAC000002        2012-10-12 02:30:00.0000000    0.0

Желаемый вывод (который у меня уже есть, но он неверный):

[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ...],
 [861958, 861959, 861960, 861961 ...],
 [862015, 862016, 862017, 862018, ...], ...]

РЕДАКТИРОВАТЬ: Решено. Когда я объединял несколько CSV-файлов в один Pandas DataFrame, нумерация индексов начиналась бы снова с 0 при конкатенации нового файла. Я сбросил нумерацию индексов, и это решило мою проблему.

Ответы [ 2 ]

0 голосов
/ 09 июля 2019

Ваше решение близко, но я думаю, что есть ошибка в условии, используемом для извлечения индексов с нулевой энергией. У вас есть:

. . .
indices = df.loc[df[df.columns[2]] == df[df.columns[2]].isnull()].index.values.tolist()
. . .

Это странный способ найти индекс строк с нулевой энергией.

У меня работает следующее:

import pandas as pd
import more_itertools as mit

df = pd.DataFrame({'energy': [0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1]})

# find the indices with zero energy
indices = df.loc[df['energy'] == 0].index.values.tolist()

# extract long outages
threshold = 4  # minimum length for an outage to be considered "long"
outages_indices = [list(group) for group in mit.consecutive_groups(indices)]
long_outages_indices = [l for l in outages_indices if len(l) >= threshold]

Если вы также хотите включить None значения для энергии, то вы можете сделать следующее:

import pandas as pd
import more_itertools as mit

df = pd.DataFrame({'energy': [0, None, 0, 0, 1, 0, 0, 1, 0, None, 0, None, 1]})
df = df.fillna(value=0)

# find the indices with zero energy
indices = df.loc[df['energy'] == 0].index.values.tolist()

# extract long outages
threshold = 4  # minimum length for an outage to be considered "long"
outages_indices = [list(group) for group in mit.consecutive_groups(indices)]
long_outages_indices = [l for l in outages_indices if len(l) >= threshold]
0 голосов
/ 09 июля 2019

Вы хотите groupby с cumsum:

df = pd.DataFrame({'energy':[1,0,0,0,1,1,0,0,0]})

# mark the non-zero
s = df.energy.ne(0)

# groupby
new_df = df.groupby([s, s.cumsum()]).apply(lambda x: list(x.index))

дает вам:

energy  energy
False   1         [1, 2, 3]
        3         [6, 7, 8]
True    1               [0]
        2               [4]
        3               [5]
dtype: object

, и эти индексы представляют интерес с индексами False level-0,то есть

new_df.loc[False]

дает вам:

energy
1    [1, 2, 3]
3    [6, 7, 8]
dtype: object
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...