Python 熊猫:列之间的差异
我有数据帧Python 熊猫:列之间的差异,python,pandas,Python,Pandas,我有数据帧 site1 time1 site2 time2 site3 time3 site4 time4 site5 time5 ... time6 site7 time7 site8 time8 site9 time9 site10 time10 target session_id
site1 time1 site2 time2 site3 time3 site4 time4 site5 time5 ... time6 site7 time7 site8 time8 site9 time9 site10 time10 target
session_id
21669 56 2013-01-12 08:05:57 55.0 2013-01-12 08:05:57 NaN NaT NaN NaT NaN NaT ... NaT NaN NaT NaN NaT NaN NaT NaN NaT 0
54843 56 2013-01-12 08:37:23 55.0 2013-01-12 08:37:23 56.0 2013-01-12 09:07:07 55.0 2013-01-12 09:07:09 NaN NaT ... NaT NaN NaT NaN NaT NaN NaT NaN NaT 0
77292 946 2013-01-12 08:50:13 946.0 2013-01-12 08:50:14 951.0 2013-01-12 08:50:15 946.0 2013-01-12 08:50:15 946.0 2013-01-12 08:50:16 ... 2013-01-12 08:50:16 948.0 2013-01-12 08:50:16 784.0 2013-01-12 08:50:16 949.0 2013-01-12 08:50:17 946.0 2013-01-12 08:50:17 0
我需要计算上次和第一次之间的差异
期望输出(转换为秒)
我可以对每一对进行合并
df['diff1'] = df['time1'] - df['time2']
...
但是有什么方法可以更快地完成吗?在数据帧上使用.ffill()
,只使用时间列:
df['diff1'] = df.filter(like='time').ffill(axis = 1).time10 - df.time1
在数据帧上使用.ffill()
df['diff1'] = df.filter(like='time').ffill(axis = 1).time10 - df.time1
- 我放弃了目标
我将您的列拆分为一个pd.MultiIndex
确保时间戳实际上是时间戳(除非您这样做,否则无需在您的端执行此操作)
groupby
'session\u id'
然后使用'first'
和'last'
获取第一个和最后一个非空值
pipe
方便地将结果传递给一个函数,该函数为我进行减法运算
- 我放弃了目标
pd.MultiIndex
groupby
'session\u id'
然后使用'first'
和'last'
获取第一个和最后一个非空值pipe
方便地将结果传递给一个函数,该函数为我进行减法运算使用:
- 带有
时间的列
- 使用last获取列名称
- 通过到
系列
- 最后
numpy替代方案
:
A = df.filter(like='time')
b = len(A.columns) - A.notnull().values[:, ::-1].argmax(1) - 1
df['diff'] = pd.Series(A.values[np.arange(len(A)),b]).sub(df['time1']).dt.total_seconds()
print (df['diff'])
0 0.0
1 1786.0
2 4.0
Name: diff, dtype: float64
更通用的解决方案-通过以下方式选择第一列和最后一列:
使用:
- 带有
时间的列
- 使用last获取列名称
- 通过到
系列
- 最后
numpy替代方案
:
A = df.filter(like='time')
b = len(A.columns) - A.notnull().values[:, ::-1].argmax(1) - 1
df['diff'] = pd.Series(A.values[np.arange(len(A)),b]).sub(df['time1']).dt.total_seconds()
print (df['diff'])
0 0.0
1 1786.0
2 4.0
Name: diff, dtype: float64
更通用的解决方案-通过以下方式选择第一列和最后一列:
如果您提供了一种方便的方法来生成样本数据,则可以使人们更容易回答您的问题。如果您提供了一种方便的方法来生成样本数据,则可以使人们更容易回答您的问题。
A = df.filter(like='time')
b = len(A.columns) - A.notnull().values[:, ::-1].argmax(1) - 1
df['diff'] = pd.Series(A.values[np.arange(len(A)),b]).sub(df['time1']).dt.total_seconds()
print (df['diff'])
0 0.0
1 1786.0
2 4.0
Name: diff, dtype: float64
df1 = df.filter(like='time')
df['diff']= df1.ffill(1).iloc[:, -1].sub(df1.iloc[:, 0]).dt.total_seconds()
print (df['diff'])
0 0.0
1 1786.0
2 4.0
Name: diff, dtype: float64