Панды нарезают быстрее - PullRequest
0 голосов
/ 02 ноября 2018

У меня сейчас есть функция и цикл. Цель состоит в том, чтобы просмотреть каждый столбец в кадре данных и, если значение индекса меньше значения, определенного functino, дать значение 0, если не оставить в качестве текущего значения.

Работает, но бегать долго. Кто-нибудь может увидеть лучший путь? Я чувствую, что должен использовать loc или iloc, но не уверен, как применить

df = pd.DataFrame(np.random.randint(0, 20, [5, 3]), columns=['A', 'B', 'C'])

   A   B   C
0   6  19  14
1  10   7   6
2  18  10  10
3   3   7   2
4   1  11   5

def split(variable_name,sDate,eDate,df):
    if eDate =='end':
        lv=df.index[-1]
        y=np.logical_and(df.index>=sDate, df.index<=lv)
        df['newvar']=y.astype(int)*df[variable_name]
    else:
        lv=eDate
        y=np.logical_and(df.index>=sDate, df.index<=eDate)
        df['newvar']=y.astype(int)*df[variable_name]
    return df

for i in df.columns:
   split(i,1,'end',df)

выход

   A   B   C
0   0  0  0
1  0   0   0
2  18  10  10
3   3   7   2
4   1  11   5 

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Чтобы получить точный результат, который вы упомянули, вы можете просто написать:

df.iloc[:2] = 0

Это установит любую строку со значением индекса <2 равным нулю. Разумеется, вы можете указать любой диапазон, и вам не придется зацикливаться, используя быстрые векторизованные операции Pandas. </p>

0 голосов
/ 02 ноября 2018

Полагаю, вам нужно сравнить по столбцам, отфильтрованным по подмножеству по списку, а затем умножить на mul:

np.random.seed(123)
df = pd.DataFrame(np.random.randint(0, 20, [5, 3]), columns=['A', 'B', 'C'])
print (df)
    A   B   C
0  13   2   2
1   6  17  19
2  10   1   0
3  17  15   9
4   0  14   0

def split(cols,sDate,eDate,df):

    #thanks jpp
    lv = df.index[-1] if eDate == 'end' else eDate

    y=np.logical_and(df.index>=sDate, df.index<=lv).astype(int)
    #alternative
    #y= (df.index>=sDate & df.index<=lv).astype(int)
    df[cols] = df[cols].mul(y, axis=0)
    #numpy alternative for multiple 
    #df[cols] = df[cols].values * y[:, None]
    return df


df1 = split(df.columns,1,'end',df)
print (df1)
    A   B   C
0   0   0   0
1   6  17  19
2  10   1   0
3  17  15   9
4   0  14   0

df1 = split(['A','B'],1,'end',df)
print (df1)
    A   B   C
0   0   0   2
1   6  17  19
2  10   1   0
3  17  15   9
4   0  14   0
...