蟒蛇& pandas-根据DataFrame中列中的某些值计算行数

时间:2016-09-06 12:16:45

标签: python pandas dataframe

我有一个包含数千行的大型DataFrame(称为df_NoMissing),我需要用它们进行计算和分析。

NoDemande

我想要做的是在NoUsagerPeriodsSens列中有两行具有相同的值,但在列HeureArriveeSurSite中有不同的行。列HeureEffectiveSens。并且因为结果与当前的DataFrame不对应,所以结果将保存在新的DataFrame中

我尝试通过识别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 来分隔DataFrame,因此我可以直接进行减法。但它根本不起作用。

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

那么我应该怎样做才能得到我想要的东西?

修改

输出如下:

{{1}}

任何帮助都会非常感激〜

2 个答案:

答案 0 :(得分:1)

所以我的解决方案是:

  1. 加入df1和df2(不附加它们,但加入外连接)。为此,您应该重命名df2中除NoDemande,NoUsager和Period之外的所有列。例如,在df1中,它将是Sens,在df2 - Sens2中。加入后尝试根据需要减去日期。

  2. 如果任何条目没有与另一个Sens值配对,也可能会出现一些错误。我认为,如果没有你的软管你应该过滤掉。因为那些有几次会话的用户只需要DureeTrajet,不是吗?那么,如果用户只有一个会话,你在df_new表中不需要他吗?

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

  4. 修改

    如果某些条目不只是一对,而是两对或更多对,那么您应该定义哪一对具有更多优先级/更有意义。

答案 1 :(得分:0)

好的,从提供的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