我有一个包含数千行的大型DataFrame(称为df_NoMissing),我需要用它们进行计算和分析。
NoDemande
我想要做的是在NoUsager
,Periods
,Sens
列中有两行具有相同的值,但在列HeureArriveeSurSite
中有不同的行。列HeureEffective
和Sens
。并且因为结果与当前的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}}
任何帮助都会非常感激〜
答案 0 :(得分:1)
所以我的解决方案是:
加入df1和df2(不附加它们,但加入外连接)。为此,您应该重命名df2中除NoDemande,NoUsager和Period之外的所有列。例如,在df1中,它将是Sens,在df2 - Sens2中。加入后尝试根据需要减去日期。
如果任何条目没有与另一个Sens值配对,也可能会出现一些错误。我认为,如果没有你的软管你应该过滤掉。因为那些有几次会话的用户只需要DureeTrajet,不是吗?那么,如果用户只有一个会话,你在df_new表中不需要他吗?
最后你应该只有那些有成对的条目。为此你可以减去日期。
修改强>
如果某些条目不只是一对,而是两对或更多对,那么您应该定义哪一对具有更多优先级/更有意义。
答案 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