4

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

使用dfs=pd.read_html(pageUrl,infer_types=False)then生成数据帧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')

目的是当“日期”为空时,用前一个单元格中的值填写“日期”中的值。

我怎样才能做到这一点?

4

2 回答 2

10
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
于 2013-09-21T18:03:11.300 回答
0

如果我正确理解了这个问题,它应该很简单,

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

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

这里有一些可以用来理解方法的链接,包括文档, https ://pandas.pydata.org/docs/reference/api/pandas.DataFrame.ffill.html https://www.studytonight.com/熊猫/熊猫数据框填充方法

于 2021-05-16T14:05:44.027 回答