Отфильтруйте каждый столбец, указав одно и то же значение три раза или более - PullRequest
0 голосов
/ 13 октября 2019

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

Я довольно новичок в python, поэтому я пытался использовать циклы for, но никак не мог заставить его работать.

for i in a.index:
    if a.loc[i,'name']==3==df.loc[i+1,'name']==df.loc[i+2,'name']:
        print(a.loc[i,"name"])

Невозможно добавить интегральное значение к метке времени без частоты.

1 Ответ

0 голосов
/ 13 октября 2019

Было бы лучше, если бы вы включили образец кадра и желаемый результат в свой вопрос. Пожалуйста, сделайте в следующий раз. Таким образом, я должен угадать, как выглядят ваши данные и, возможно, не отвечает на ваш вопрос. Я предполагаю, что значения являются целыми числами. Есть ли в вашем датафрейме строки на каждый день? Я предполагаю, что это может быть не так. Я сделаю так, чтобы каждый день за последние дельта дней подряд. Я создал примерный фрейм данных следующим образом:

import pandas as pd
import numpy as np
import datetime

# Here I am just creating random data from your description
delta = 365
start_date = datetime.datetime.now() - datetime.timedelta(days=delta)
end_date = datetime.datetime.now()
datetimes = [end_date - diff for diff in [datetime.timedelta(days=i) for i in range(delta,0,-1)]]
# This is the list of dates we will have in our final dataframe (includes all days)
dates = pd.Series([date.strftime('%Y-%m-%d') for date in datetimes], name='Date', dtype='datetime64[ns]')
# random integer dataframe
df = pd.DataFrame(np.random.randint(0, 5, size=(delta,4)), columns=['item' + str(i) for i in range(4)])
df = pd.concat([df, dates], axis=1).set_index('Date')
# Create a missing day
df = df.drop(df.loc['2019-08-01'].name)
# Reindex so that index has all consecutive days
df = df.reindex(index=dates)

Теперь, когда у нас есть примерный фрейм данных, все остальное будет просто. Я собираюсь проверить, равно ли значение в кадре данных 0, а затем выполнить скользящую сумму с окном 4 (> 3). Таким образом, я могу избежать петель. Результирующий информационный кадр имеет все строки, где хотя бы один из элементов имел значение 0 для 4 последовательных строк. Если существует 0 для более чем окна последовательных строк, он будет отображаться в виде двух строк, в которых даты расположены на расстоянии всего одного дня. Я надеюсь, что это имеет смысл.

# custom function as I want "np.nan" returned if a value does not equal "test_value" 
def equals(df_value, test_value=0):
    return 1 if df_value == test_value else np.nan
# apply the function to every value in the dataframe
# for each row, calculate the sum of four subsequent rows (>3)
df = df.applymap(equals).rolling(window=4).sum()
# if there was np.nan in the sum, the sum is np.nan, so it can be dropped
# keep the rows where there is at least 1 value
df = df.dropna(thresh=1)
# drop all columns that don't have any values
df = df.dropna(thresh=1, axis=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...