Как применять операции к строкам фрейма данных, но с затронутыми переменными столбцами?

У меня есть фрейм данных, который считывается из 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  

person Inder Jalli    schedule 25.01.2017    source источник


Ответы (1)


Первое, что я делаю, это удостоверяю, что SystemStart datetime

df.SystemStart = pd.to_datetime(df.SystemStart)

Затем я выдеваю SystemStart в отдельную серию

st = df.SystemStart

Потом бросаю SytstemStart из своего df

d1 = df.drop('SystemStart', 1)

Затем я конвертирую оставшиеся столбцы в datetime

d1.columns = pd.to_datetime(d1.columns)

Наконец, я использую numpy широковещательную рассылку, чтобы замаскировать соответствующие ячейки и снова присоединиться к SystemStart.

d1.where(d1.columns.values >= st.values[:, None]).join(st)

введите здесь описание изображения

person piRSquared    schedule 26.01.2017
comment
Привет! Не могли бы вы указать мне на какие-нибудь хорошие руководства по операциям трансляции в пандах? Я читал руководства Numpy, но у меня возникли проблемы с передачей этих знаний самому pandas. Буду признателен за помощь. - person Inder Jalli; 26.05.2017
comment
@InderJalli Экспериментируйте, ищите, задавайте вопросы. Это лучший совет, который я могу дать. - person piRSquared; 26.05.2017