扩展数据框中的每一行

时间:2018-02-28 18:59:10

标签: python pandas

考虑这个简单的例子

data = pd.DataFrame({'mydate' : [pd.to_datetime('2016-06-06'),
                                 pd.to_datetime('2016-06-02')],
                     'value' : [1, 2]})

data.set_index('mydate', inplace = True)

data
Out[260]: 
            value
mydate           
2016-06-06      1
2016-06-02      2

我想迭代每一行,以便数据框得到"放大"在当前行的每个索引值(这是一个日期)周围的几天(前2天,后2天)。

例如,如果您考虑第一行,我想告诉Pandas再添加4行,对应于天2016-06-042016-06-052016-06-07和{{1} }。这些额外行的2016-06-07可以是value中该行的所有内容(在本例中为1)。该逻辑应用于每一行,最终的数据帧是所有这些放大的数据帧的串联。

我在value中尝试了以下功能:

apply(., axis = 1)

但不幸的是我跑了  def expand_onerow(df, ndaysback = 2, nhdaysfwd = 2): new_index = pd.date_range(pd.to_datetime(df.name) - pd.Timedelta(days=ndaysback), pd.to_datetime(df.name) + pd.Timedelta(days=nhdaysfwd), freq='D') newdf = df.reindex(index=new_index, method='nearest') #New df with expanded index return newdf 给出:

data.apply(lambda x: expand_onerow(x), axis = 1)

我尝试的另一种方法如下:我首先重置索引,

  File "pandas/_libs/tslib.pyx", line 1165, in pandas._libs.tslib._Timestamp.__richcmp__

TypeError: ("Cannot compare type 'Timestamp' with type 'str'", 'occurred at index 2016-06-06 00:00:00')

然后我稍微修改了我的功能

data.reset_index(inplace = True)
data
Out[339]: 
      mydate  value
0 2016-06-06      1
1 2016-06-02      2

给出了

def expand_onerow_alt(df, ndaysback = 2, nhdaysfwd = 2):

    new_index = pd.date_range(pd.to_datetime(df.mydate) - pd.Timedelta(days=ndaysback), 
                              pd.to_datetime(df.mydate) + pd.Timedelta(days=nhdaysfwd), 
                              freq='D')
    newdf = pd.Series(df).reindex(index = new_index).T  #New df with expanded index
    return newdf

更接近但尚未......

我不明白这里有什么问题。我错过了什么?我在这里寻找最多的Pandonic方法。

谢谢!

1 个答案:

答案 0 :(得分:1)

我修改了你的一点功能

self.inputTextField.topAnchor.constraint(equalTo: topAnchor).isActive = true

更多信息

基本上一行等于

def expand_onerow(df, ndaysback = 2, nhdaysfwd = 2):

    new_index = pd.date_range(pd.to_datetime(df.index[0]) - pd.Timedelta(days=ndaysback),
                              pd.to_datetime(df.index[0]) + pd.Timedelta(days=nhdaysfwd),
                              freq='D')

    newdf = df.reindex(index=new_index, method='nearest')     #New df with expanded index
    return newdf

pd.concat([expand_onerow(data.loc[[x],:], ndaysback = 2, nhdaysfwd = 2) for x ,_ in data.iterrows()])


Out[455]: 
            value
2016-05-31      2
2016-06-01      2
2016-06-02      2
2016-06-03      2
2016-06-04      2
2016-06-04      1
2016-06-05      1
2016-06-06      1
2016-06-07      1
2016-06-08      1