熊猫:根据日期将另一行输入数据框

时间:2018-07-11 14:19:07

标签: python pandas

所以我有一个像这样的数据框

date    people  flight
0   04/12/61    1   Vostok 1
1   04/15/61    0   Vostok 2
2   05/04/61    0   none
3   05/05/61    1   Freedom 7
4   05/09/61    0   none
5   07/20/61    0   none

我想在排期结束并转到另一个排期/或不排空的值之间输入另一行。该行的日期应该是更改后的值的前一天(并且保留航班的 名称 人数 ,所以最终日期看起来像这样:

0   04/12/61    1   Vostok 1
1   04/14/61    1   Vostok 1
2   04/15/61    0   Vostok 2
3   05/04/61    0   none
4   05/05/61    1   Freedom 7
5   05/08/61    1   Freedom 7
6   05/09/61    0   none
7   07/20/61    0   none

很抱歉,您遇到了非常具体的问题,但我们将不胜感激!

2 个答案:

答案 0 :(得分:0)

IIUC

df.replace({0:np.nan,'none':np.nan}).bfill(limit=1).fillna({'people':0,'flight':'none'})
Out[19]: 
       date  people    flight
0  04/12/61     1.0   Vostok1
1  04/13/61     0.0      none
2  05/04/61     1.0  Freedom7
3  05/05/61     1.0  Freedom7
4  05/09/61     0.0      none
5  07/20/61     0.0      none

更新

df.date=pd.to_datetime(df.date)

sdx=df.index[df.people.eq(1)]


tempdf=pd.DataFrame({'date':(df.loc[sdx,'date']-pd.to_timedelta('1 days')).values,'people':df.loc[sdx,'people'].values,'flight':df.loc[sdx,'flight'].values
              },index=sdx+1)


pd.concat([df,tempdf]).sort_values('date').sort_index()

        date    flight  people
0 2061-04-12   Vostok1       1
1 2061-04-11   Vostok1       1
1 2061-04-15   Vostok2       0
2 2061-05-04      none       0
3 2061-05-05  Freedom7       1
4 2061-05-04  Freedom7       1
4 2061-05-09      none       0
5 2061-07-20      none       0

答案 1 :(得分:0)

我看到您还有一个整数索引。将其设置为一列(added_column)。然后创建另一个与原始数据帧相同的数据帧。

df_copy = df.copy()

在df_copy中将索引增加1

df_copy["added_column"] += 1

使用added_column连接df和df_copy,使用后缀(_original和_copy)将列与原始数据帧和复制的数据帧区分开。让我们将结果称为df_merged。

如果我的理解是正确的,则要包含在数据框中的记录如下(您还必须将date_copy减少一天):

df_merged [df_merged.flight.notnull()] [[date_copy,people_original,flight_original]]