计算有条件的连续熊猫数据框行之间的天差

时间:2020-07-29 01:11:14

标签: pandas

我有一个如下数据框:

Company     Date        relTweet    GaplastRel
XYZ         3/2/2020    1               
XYZ         3/3/2020    1   
XYZ         3/4/2020    1   
XYZ         3/5/2020    1   
XYZ         3/5/2020    0   
XYZ         3/6/2020    1   
XYZ         3/8/2020    1   
ABC         3/9/2020    0   
ABC         3/10/2020   1   
ABC         3/11/2020   0   
ABC         3/12/2020   1   

relTweet显示该推文是否相关(1)(0)。 \ n我需要找到每个公司的每个连续行之间的天差(GaplastRel),条件是前一天的tweet应该是相关的tweet(即relTweet = 1)。例如对于第一个记录,relTweet应该为0。对于第二个记录,relTweet应该为1,因为前一个相关的推文是一天前制作的。

下面是所需输出的示例:

Company     Date        relTweet    GaplastRel
XYZ         3/2/2020    1               0
XYZ         3/3/2020    1               1
XYZ         3/4/2020    1               1
XYZ         3/5/2020    1               1
XYZ         3/5/2020    0               1
XYZ         3/6/2020    1               1
XYZ         3/8/2020    1               2
ABC         3/9/2020    0               0
ABC         3/10/2020   1               0
ABC         3/11/2020   0               1
ABC         3/12/2020   1               2

以下是我的代码:

dataDf['Date'] = pd.to_datetime(dataDf['Date'], format='%m/%d/%Y')

dataDf['relTweet'] = (dataDf.groupby('Company', group_keys=False)
                .apply(lambda g: g['Date'].diff().replace(0, np.nan).ffill()))

此代码给出每个公司连续行之间的天差,而无需考虑relTweet = 1条件。我不确定如何应用该条件。 以下是上述代码的输出:

Company     Date        relTweet    GaplastRel
XYZ         3/2/2020    1               NaT
XYZ         3/3/2020    1               1 days
XYZ         3/4/2020    1               1 days
XYZ         3/5/2020    1               1 days
XYZ         3/5/2020    0               0 days
XYZ         3/6/2020    1               1 days
XYZ         3/8/2020    1               2 days
ABC         3/9/2020    0               NaT
ABC         3/10/2020   1               1 days
ABC         3/11/2020   0               1 days
ABC         3/12/2020   1               1 days

1 个答案:

答案 0 :(得分:2)

我们需要merge_asof而不是groupby的时候改变主意

df1=df.loc[df['relTweet']==1,['Company','Date']]
df=pd.merge_asof(df,df1.assign(Date1=df1.Date),by='Company',on='Date', allow_exact_matches=False)
df['GaplastRel']=(df.Date-df.Date1).dt.days.fillna(0)
df
Out[31]: 
   Company       Date  relTweet      Date1  GaplastRel
0      XYZ 2020-03-02         1        NaT         0.0
1      XYZ 2020-03-03         1 2020-03-02         1.0
2      XYZ 2020-03-04         1 2020-03-03         1.0
3      XYZ 2020-03-05         1 2020-03-04         1.0
4      XYZ 2020-03-05         0 2020-03-04         1.0
5      XYZ 2020-03-06         1 2020-03-05         1.0
6      XYZ 2020-03-08         1 2020-03-06         2.0
7      ABC 2020-03-09         0        NaT         0.0
8      ABC 2020-03-10         1        NaT         0.0
9      ABC 2020-03-11         0 2020-03-10         1.0
10     ABC 2020-03-12         1 2020-03-10         2.0