python&根据DataFram中列中的某些值计算bewteen行

2024-05-14 14:46:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含数千行的大型数据帧(称为df\ NoMissing),我需要对它们进行计算和分析。你知道吗

   NoDemande   NoUsager  Sens  IdVehiculeUtilise  Fait  HeureArriveeSurSite   HeureEffective      Periods
0 42196000013  000001    +         287Véh          1  11/07/2015 08:02:07  11/07/2015 08:02:13    Matin
1 42196000013  000001    -         287Véh          1  11/07/2015 08:17:09  11/07/2015 08:17:13    Matin
2 42196000002  000314    +         263Véh          1  11/07/2015 09:37:43  11/07/2015 09:53:37    Matin
3 42196000016  002372    +         287Véh          1  11/07/2015 09:46:42  11/07/2015 10:01:39    Matin
4 42196000015  000466    +         287Véh          1  11/07/2015 09:46:42  11/07/2015 10:01:39    Matin
5 42196000002  000314    -         263Véh          1  11/07/2015 10:25:17  11/07/2015 10:38:11    Matin
6 42196000015  000466    -         287Véh          1  11/07/2015 10:48:51  11/07/2015 10:51:30    Matin
7 42196000016  002372    -         287Véh          1  11/07/2015 11:40:56  11/07/2015 11:41:01    Matin
8 42196000004  002641    +         263Véh          1  11/07/2015 13:39:29  11/07/2015 13:52:50    Soir
9 42196000004  002641    -         263Véh          1  11/07/2015 13:59:56  11/07/2015 14:07:41    Soir  

我想做的是在NoDemandeNoUsagerPeriods列中有两个值相同但在Sens列中不同的行在HeureArriveeSurSite列和HeureEffective列之间做减法。由于结果与当前数据帧不对应,因此结果将保存在新的数据帧中


我试图通过识别Sens来分离数据帧,这样就可以直接进行减法运算。但根本不起作用。你知道吗

df_new = pd.DataFrame(columns=['NoDemande', 'NoUsager', 'Periods', 'DureeTrajet']
df1 = df_NoMissing[(df_NoMissing['Sens'] == '+') & (df_NoMissing['Periods'] == 'Matin')]
df2 = df_NoMissing[(df_NoMissing['Sens'] == '-') & (df_NoMissing['Periods'] == 'Matin')] 

df_new['DureeTrajet'] = df2['HeureArriveeSurSite'].values-df1['HeureEffective'].values

这个返回:ValueError: operands could not be broadcast together with shapes (1478,) (1479,)

我还尝试了加载方式,每次都准确地说出我想要什么:

df1.loc[df1['NoDemande'] == '42196000015','HeureEffective'] - df2.loc[df2['NoDemande'] == '42196000015','HeureArriveeSurSite']

但这次回来的是:

4   NaT
6   NaT
dtype: timedelta64[ns]

我该怎么做才能得到我想要的?你知道吗


编辑

输出如下所示:

  NoDemande   NoUsager   Periods   DureeTrajet
0 42196000013  000001     Matin     00:14:54
1 42196000002  000314     Matin     00:31:40
2 42196000016  002372     Matin     00:39:23
3 42196000015  000466     Matin     00:47:12
4 42196000004  002641     Soir      00:07:06

~任何帮助都将不胜感激~


Tags: 数据dfnewdf1sensdf2periodsmatin
2条回答

所以我的解决方案是:

  1. 联接df1和df2(不是附加它们,而是用外部联接联接)。为此,应该重命名df2中除NoDemande、NoUsager和Period之外的所有列。例如,在df1中是Sens,在df2中是Sens2。加入之后,试着减去你想要的日期。

  2. 如果任何一个条目没有一个与另一个Sens值对应的条目,也可能会丢失一些内容。我想,如果你不在的话,你应该过滤掉。因为你只需要DureeTrajet就可以为那些有好几个会话的用户提供服务,不是吗?所以,如果一个用户只有一个会话,你不需要他在df\u新表中?

  3. 最后你应该只有那些条目,它们是成对的。为此你可以减去日期。

编辑:

如果某些条目不仅有一对,而且有两对或更多对,那么您应该定义哪个对具有更高的优先级/更有意义。你知道吗

好的,从提供的DF开始-让我们在分组列上创建一个索引,并为Sens操作透视到列:

temp = df.set_index(['NoDemande', 'NoUsager', 'Periods']).pivot(columns='Sens')

然后-我们取适当的差异(根据您的代码):

duration = (temp['HeureArriveeSurSite', '-'] - temp['HeureEffective', '+']).to_frame(name='DureeTrajet').reset_index()

这就给了你:

     NoDemande  NoUsager Periods  DureeTrajet
0  42196000002       314   Matin     00:31:40
1  42196000004      2641    Soir     00:07:06
2  42196000013         1   Matin     00:14:56
3  42196000015       466   Matin     00:47:12
4  42196000016      2372   Matin     01:39:17

相关问题 更多 >

    热门问题