Панды: Groupby Fillna не работает

У меня есть следующий кадр данных, в котором около 4000 тикеров и всего около 2 миллионов строк:

Ticker      Date              Rank         
  1         01/01/2000         5            
  1         01/02/2000        NaN             
  2         01/01/2000         4            
  2         01/02/2000         2            

Теперь я запускаю следующий код для переноса столбца Rank, который отлично работает:

import pandas as pd
df= df.sort_values(by=["Ticker", "Date"], ascending=[True,True])
df['Rank'] = df.groupby('Ticker')['Rank'].fillna(value=None, method="ffill")

Однако теперь я хочу перенести другой столбец. Чтобы создать этот столбец, я делаю следующее:

  import numpy as np
  df["Code"]=np.NaN

В этой функции я пишу некоторый код, который заменяет около 200 значений на 1 в соответствии с датой и значениями тикера в df «добавить». Этот код работает и выглядит следующим образом:

df["Code"][(df.Date == add) & (df["Ticker"] == column)] = 1

Это делает мой фреймворк данных таким:

Ticker      Date              Rank          Code      
  1         01/01/2000         5             NaN
  1         01/02/2000        NaN            NaN
  2         01/01/2000         4              1
  2         01/02/2000         2             NaN

Теперь я хочу перенести этот столбец, но код занимает вечность.

import pandas as pd
df= df.sort_values(by=["Ticker", "Date"], ascending=[True,True])
df['Code'] = df.groupby('Ticker')['Code'].fillna(value=None, method="ffill")

Я запускал его два дня, и мой компьютер разбился. Здесь должна быть какая-то ошибка в том, как я это делаю, потому что вышеупомянутый перенос выполняется так быстро, а этот даже не заканчивается. Я проверил dtype «Код», и это float64.

Кто-нибудь может помочь?


person freddy888    schedule 27.06.2017    source источник
comment
Трудный вопрос, почему он работает очень долго. Но я считаю, что если группы уже отсортированы, можно добавить sort=False для повышения производительности.   -  person jezrael    schedule 27.06.2017


Ответы (1)


Я пытаюсь немного улучшить ваш код с помощью sort=False до groupby< /a> и DataFrameGroupBy.ffill:

#convert column to datetime
df["Date"] = pd.to_datetime(df["Date"])
#ascending can be omit, because default value
df= df.sort_values(by=["Ticker", "Date"])

df['Rank'] = df.groupby('Ticker', sort=False)['Rank'].ffill()
add = '01/01/2000'
column = 2

df.loc[(df.Date == add) & (df["Ticker"] == column), "Code"] = 1

#sorting again is not necessary
df['Code'] = df.groupby('Ticker', sort=False)['Code'].ffill()
print (df)
   Ticker       Date  Rank  Code
0       1 2000-01-01   5.0   NaN
1       1 2000-01-02   5.0   NaN
2       2 2000-01-01   4.0   1.0
3       2 2000-01-02   2.0   1.0
person jezrael    schedule 27.06.2017
comment
Спасибо, это работает, но проблема все еще с наполнителем. Может быть, проблема в том, что Ticker является категоричным типом данных? - person freddy888; 27.06.2017
comment
Думаю, нет. Проблема не в замене? Кажется, проблема с данными. Можно ли создать csv из данных и протестировать его? И если все еще проблема и данные не конфиденциальны, можно отправить мне на мою электронную почту в моем профиле? - person jezrael; 27.06.2017