熊猫:Groupby Fillna不工作

时间:2017-06-27 07:19:28

标签: python pandas group-by fillna

我有以下数据框,其中有大约4000个代码,总共约有200万行:

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

在这个函数中,我写了一些代码,根据df“add”中的日期和自动收报机值,大约200个值将被1替换。此代码可以工作并查看以下内容:

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。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

我尝试使用sort=FalsegroupbyDataFrameGroupBy.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