有两份,但有关联。我有这种形式的数据框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]
有想法吗?
答案 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()