Итак, вот пример dateutil.relativedelta
, который я нашел полезным для итерации в прошлом году, пропуская месяц каждый раз до текущей даты:
>>> import datetime
>>> from dateutil.relativedelta import relativedelta
>>> today = datetime.datetime.today()
>>> month_count = 0
>>> while month_count < 12:
... day = today - relativedelta(months=month_count)
... print day
... month_count += 1
...
2010-07-07 10:51:45.187968
2010-06-07 10:51:45.187968
2010-05-07 10:51:45.187968
2010-04-07 10:51:45.187968
2010-03-07 10:51:45.187968
2010-02-07 10:51:45.187968
2010-01-07 10:51:45.187968
2009-12-07 10:51:45.187968
2009-11-07 10:51:45.187968
2009-10-07 10:51:45.187968
2009-09-07 10:51:45.187968
2009-08-07 10:51:45.187968
Как и в случае с другими ответами , вам нужно выяснить, что вы на самом деле имеете в виду «через 6 месяцев». Если вы имеете в виду «сегодняшний день месяца в месяце шесть лет в будущем», тогда это будет делать:
datetime.datetime.now() + relativedelta(months=6)
Я предполагаю, что ваше требование следующее:
Если мое понимание верно, тогда, пожалуйста, следуйте приведенному ниже решению.
Шаг 1:
Чтобы получить ваш поднабор данных, кажется, что имена ваших столбцов следуют шаблону, мы можем использовать это в цикле и создайте новый фрейм данных из него (может быть лучший способ, но я считаю, что это должно работать отлично)
df_subset = pd.DataFrame() # Creating a new dataframe
for cols in list(df.columns): # Assuming df is the original dataframe
if 'Prod_' in cols:
df_subset[cols] = df[cols]
Это должно вернуть вам подмножество интересующих столбцов. [1119 ]
Шаг 2:
У меня было похожее рабочее требование, но у меня было несколько значений np.nan
в моем фрейме данных которые должны были быть проигнорированы, но не удалены при выполнении проверки. Если это так с вами, пожалуйста, смотрите ниже код другой мудрый, пожалуйста, перейдите к следующему шагу:
for cols in list(df_subset.columns):
df_subset.loc[df_subset[cols].isnull(),cols] = df_subset['Prod_code_1']
Здесь я просто заменяю значения null
в любом столбце в любой строке на значение первый столбец (при условии, что первый столбец всегда будет содержать значение).
Шаг 3:
Проверка, все ли значения столбца для строки равны или нет
[ 112]Здесь я просто проверяю значение столбцов данных со значением первого столбца. Пожалуйста, следуйте документации панд eq , чтобы узнать больше.
Эти шаги должны делать то, что вы пытаетесь там.
Вы можете использовать атрибут is_unique , чтобы проверить, имеет ли строка только одно и то же значение.
df.apply(lambda row: row.is_unique, axis=1)
Также см .:
Series.nunique
Series.unique
Ваши данные широки: есть множество полей, которые отслеживают похожие показатели. Вы можете найти полезным расплавить свой df, используя df.melt()
.
скажем, ваш фрейм данных df
, и вы заинтересованы в полях list = ['prod_code_1', 'prod_code_2', ... , 'prod_code_47']
meltdf = df.melt(id_vars='some id', value_vars=list, var_name='prod_code')
, теперь все ваши поля 'prod_code_ #' находятся в одном столбце. Надеюсь, это поможет вам начать в правильном направлении.