Python Pandas - 在以下单元格为空的列中填写文本值

时间:2013-09-21 17:50:21

标签: python numpy pandas

我有一个数据框,我正在尝试填写“日期”列(文本)中的值,如下所示:

使用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)

这会使用'Time'填充'Date'列。

然后我尝试使用axis = 0(每列基础)并修改函数,因此它只将其应用于'Date'列(我无法看到如何将其应用于一列)

    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')

目的是使用“日期”为空白时前一个单元格中的值填充“日期”中的值。

我该怎么做?

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:0)

如果我正确理解问题,应该很简单,

df['Date'] = ['Date'].ffill(axis=0)

这将使用同一列中先前可用的值填充任何缺失值。

这里有一些可以用来理解方法的链接,包括文档, https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.ffill.html https://www.studytonight.com/pandas/pandas-dataframe-ffill-method