2013-09-21 51 views
2

我有一個數據幀和我試圖向下填充「日期」欄(即文本)的值,如下所示:Python的大熊貓 - 在下面的單元格爲空列向下填充文本值

數據幀是使用dfs=pd.read_html(pageUrl,infer_types=False)然後df=dfs[0]

  Date  Time datetime Year 
    0    None  None 2007 
    1  May 1  0:58  None 2007 
    2    1:00  None 2007 
    3    1:30  None 2007 
    4    1:45  None 2007 
    5    3:45  None 2007 
    6    4:45  None 2007 
    7    6:30  None 2007 
    8    7:15  None 2007 
    9    7:45  None 2007 

df.dtypes節目生成的;

Date  object 
    Time  object 
    datetime object 
    Year   int64 
    dtype: object 

首先,我嘗試填充每行的基礎。竟將後面一排,以獲得先前的值,如果當前的「日期」爲空:

def fillDate(r): 
     if r['Date']=="": 
      p=r.shift(-1) 
      r['Date']=p['Date'] 
     return r 

然後

df.apply(fillDate,axis=1) 

這填充「日期」一欄用「時間」。

所以然後我嘗試應用axis = 0(每列的基礎)和修改函數,所以它只適用於'日期'列(我看不到如何將其應用於只有一列)

def fillDate(r): 
     if r.name=='Date': 
      if r['Date']=="": 
       p=r.shift(-1) 
       r['Date']=p['Date'] 
     return r 

然後

df.apply(fillDate,axis=0) 

給出了錯誤

KeyError: ('Date', u'occurred at index Date') 

目的是向下填充噸當'日期'爲空時,他在'日期'中使用前一個單元的值。

我該怎麼做?

回答

6
In [16]: df = pd.read_fwf(StringIO(data),widths=[5,12,8,8,6],header=0,names=['idx','date','time','datetime','year']) 

# simulate what the OP actually has (though this doesn't happen upon read in) 

In [30]: df['date'] = df['date'].fillna('') 

In [31]: df 
Out[31]: 
    idx date time datetime year 
0 0   None  None 2007 
1 1 May 1 0:58  None 2007 
2 2   1:00  None 2007 
3 3   1:30  None 2007 
4 4   1:45  None 2007 
5 5   3:45  None 2007 
6 6   4:45  None 2007 
7 7   6:30  None 2007 
8 8   7:15  None 2007 
9 9   7:45  None 2007 

In [32]: df.loc[df.date=='','date'] = np.nan 

In [33]: df 
Out[33]: 
    idx date time datetime year 
0 0 NaN None  None 2007 
1 1 May 1 0:58  None 2007 
2 2 NaN 1:00  None 2007 
3 3 NaN 1:30  None 2007 
4 4 NaN 1:45  None 2007 
5 5 NaN 3:45  None 2007 
6 6 NaN 4:45  None 2007 
7 7 NaN 6:30  None 2007 
8 8 NaN 7:15  None 2007 
9 9 NaN 7:45  None 2007 

In [34]: df['date'] = df['date'].ffill() 

In [35]: df 
Out[35]: 
    idx date time datetime year 
0 0 NaN None  None 2007 
1 1 May 1 0:58  None 2007 
2 2 May 1 1:00  None 2007 
3 3 May 1 1:30  None 2007 
4 4 May 1 1:45  None 2007 
5 5 May 1 3:45  None 2007 
6 6 May 1 4:45  None 2007 
7 7 May 1 6:30  None 2007 
8 8 May 1 7:15  None 2007 
9 9 May 1 7:45  None 2007 
+0

這不起作用,因爲空'Date'值不是'NaN',它們是空字符串。另外,理想情況下,我想用'apply'來做這個事情,因爲在我爲了簡化這個問題而去掉的那個函數中還有其他一些我想做的事情。 – zio

+0

很容易'模擬'你實際上有什麼,不知道他們是如何到達那裏,因爲你沒有顯示你如何生成這個框架 – Jeff

+0

然後顯示你真正想要的;這是實現它的有效方式,應用本質上是一個Python空間循環 – Jeff