У меня есть фрейм данных, который считывается из csv и имеет посторонние данные. Решение о том, что является посторонним, делается путем оценки одного столбца, SystemStart. Любые данные для каждой строки, которые находятся в столбце с заголовком значения даты ниже, чем SystemStart для этой строки, устанавливаются в nan. Например, index = 'one' имеет дату SystemStart «2016-1-5», а когда задан pd.date_range, у него нет значений nan для заполнения. index = 'three' равно '2016-1-7' и, следовательно, имеет два значения nan, заменяющие исходные данные.
Я могу идти строка за строкой и выдавать значения np.nan во все столбцы, но это медленно. Есть более быстрый способ?
Я создал репрезентативный фрейм данных ниже и хочу получить тот же результат без итеративных операций или способа ускорить эти операции. Любая помощь будет принята с благодарностью.
import pandas as pd
import numpy as np
start_date = '2016-1-05'
end_date = '2016-1-7'
dates = pd.date_range(start_date, end_date, freq='D')
dt_dates = pd.to_datetime(dates, unit='D')
ind = ['one', 'two', 'three']
df = pd.DataFrame(np.random.randint(0,100,size=(3, 3)), columns = dt_dates, index = ind)
df['SystemStart'] = pd.to_datetime(['2016-1-5', '2016-1-6', '2016-1-7'])
print 'Initial Dataframe: \n', df
for msn in df.index:
zero_date_range = pd.date_range(start_date, df.loc[msn,'SystemStart'] - pd.Timedelta(days=1), freq='D')
# we set zeroes for all columns in the index element in question - this is a horribly slow way to do this
df.loc[msn, zero_date_range] = np.NaN
print '\nAltered Dataframe: \n', df
Ниже приведены исходные и измененные выходы df:
Initial Dataframe:
2016-01-05 00:00:00 2016-01-06 00:00:00 2016-01-07 00:00:00 \
one 24 23 65
two 21 91 59
three 62 77 2
SystemStart
one 2016-01-05
two 2016-01-06
three 2016-01-07
Altered Dataframe:
2016-01-05 00:00:00 2016-01-06 00:00:00 2016-01-07 00:00:00 \
one 24.0 23.0 65
two NaN 91.0 59
three NaN NaN 2
SystemStart
one 2016-01-05
two 2016-01-06
three 2016-01-07