在groupby之后复制列,然后找出时间增量

时间:2019-11-21 18:48:33

标签: python pandas dataframe

有两份,但有关联。我有这种形式的数据框df1

a  b  c  date1  date2
a1 b1 c1 date11 date21
a1 b2 c2 date12 date22
a1 b2 c3 date13 date23

第一个问题:我想获得另一个由a和b分组并显示date1(已移位)和date2的多索引数据框。 像这样

a  b  date1_shifted  date2
a1 b1 NaN            date21
   b2 date13         date22
      NaN            date23

必须有更好的方法,但这就是我所做的

date1_shifted = df1.groupby(['a', 'b']).agg({'date1':lambda x: x})
df = date1_shifted.groupby(level=[0,1]).shift(-1)
df.rename(columns={'date1':'date1_shifted'}, inplace=True)
dummy = df1.groupby(['a','b']).agg({'date2':lambda x: x})
df=df.merge(dummy, left_index= True, right_index= True)

上面的代码可以完成工作,但是很丑。但是,最大的问题是date1_shifted和date2的日期时间数据类型已从日期时间更改为对象。

哪个提出第二个问题-我想再增加一列'time_delta',它是date1_shifted和date2之间的区别

df['time_delta']=df['date1_shifted']-df['date2]

结果

a  b  date1_shifted  date2   time_delta
a1 b1 NaN            date21  NaN
   b2 date13         date22  179000000000 nanoseconds
      NaN            date23  NaN

请注意显式编写的“纳秒”。它也是一个Object数据类型,使用此列作为条件时遇到了麻烦。例如:

df[df['time_delta']>30]

有想法吗?

1 个答案:

答案 0 :(得分:0)

稍微简单些:

df= df.set_index(['a','b'])
df["date1_shifted"]=df.date1.groupby(level=[0,1]).shift(-1)
df=df.reindex(columns=["date1_shifted","date2"])
df["time_delta"]= (pd.to_datetime(df.date1_shifted)-pd.to_datetime(df.date2)).astype("np.int64")
df=df.reset_index()