2015-08-20 2 views
0

Я хочу заменить предыдущее значение строки всякий раз, когда значение 0 найдено в столбце фрейма данных в python. Я использовал следующий код,Эффективный способ вызова предыдущей строки в python

if not a[j]: 
    a[j] = a[j-1] 

, а также

if a[j]==0: 
    a[j]=a[j-1] 

Обновление:

Полный код обновлен:

for i in pd.unique(r.a): 
    sub=r[r.vehicle_id==i] 
    sub=DataFrame(sub,columns= ['a','b','c','d','e']) 
    sub=sub.drop_duplicates(["a","b","c","d"]) 
    sub['c']=pd.to_datetime(sub['c'],unit='s') 

    for j in range(1, len(sub[1:])): 

     if not sub.d[j]: 
      sub.d[j] = sub.d[j-1] 
     if not sub.e[j]: 
      sub.e[j]=sub.e[j-1] 

    sub=sub.drop_duplicates(["lash_angle","lash_check_count"]) 

Это запуск моего кода. строка sub.d [j] только откладывается

Эти оба, кажется, хорошо работают при использовании целочисленных значений. Один из столбцов содержит десятичные значения. При использовании кода для этого столбца для завершения инструкции требуется огромное количество времени (почти 15-20 секунд). Я прохожу через почти 10000 идентификаторов и трачу 15 секунд на этом этапе, делая весь мой код неэффективным. Есть ли лучший способ, я могу сделать это для значений с плавающей запятой (десятичной), чтобы было намного быстрее?

Благодаря

+0

15s, чтобы проверить, является ли 'a [j] == 0'? Это звучит необоснованно ... –

+0

Показать еще. Проблема не в этих строках. –

+0

В любом случае тест должен быть, если abs (a [j]) paisanco

ответ

0

Предполагая, что «колонке dataframe» вы имеете в виду, вы на самом деле речь идет о колонке (ряда) пандами DataFrame, то одна хитрость заключается в замене 0 на нан, а затем Форвард заполнить. Например:

>>> df = pd.DataFrame(np.random.randint(0,4, 10**6)) 
>>> df.head(10) 
    0 
0 0 
1 3 
2 3 
3 0 
4 1 
5 2 
6 3 
7 2 
8 0 
9 3 
>>> df[0] = df[0].replace(0, np.nan).ffill() 
>>> df.head(10) 
    0 
0 NaN 
1 3 
2 3 
3 3 
4 1 
5 2 
6 3 
7 2 
8 2 
9 3 

, где вы можете решить для себя, как вы хотите, чтобы обрабатывать случай 0 в начале, где вы не имеете никакого значения для заполнения. Это предполагает, что уже нет значений NaN, которые вы хотите оставить в покое, но если есть, вы можете просто использовать маску с .loc, чтобы выбрать только те, которые вы хотите изменить.

+0

ffill - хорошая идея. Я попробую это и посмотрю. – haimen

Смежные вопросы