基于其他时间戳向数据帧添加时间戳的Pythonic方法

基于其他时间戳向数据帧添加时间戳的Pythonic方法,python,pandas,dataframe,replace,vectorization,Python,Pandas,Dataframe,Replace,Vectorization,对我来说,索引到熊猫数据帧以更改值的时髦方式很难实现。我永远不知道我是在更改dataframe元素的值,还是在更改该值的副本 我还不熟悉python对数组进行操作的语法,并且很难在python中将索引上的循环(如在C++中)转换为向量操作。 我的问题是,我希望根据其他列中的值向数据帧添加一列pandas.Timestamp值。假设我从一个数据帧开始,比如 import pandas as pd import numpy as np mydata = np.transpose([ [11, 22,

对我来说,索引到熊猫数据帧以更改值的时髦方式很难实现。我永远不知道我是在更改dataframe元素的值,还是在更改该值的副本

我还不熟悉python对数组进行操作的语法,并且很难在python中将索引上的循环(如在C++中)转换为向量操作。 我的问题是,我希望根据其他列中的值向数据帧添加一列
pandas.Timestamp
值。假设我从一个数据帧开始,比如

import pandas as pd
import numpy as np
mydata = np.transpose([ [11, 22, 33, 44, 66, 77],
         pd.to_datetime(['2015-02-26', '2015-02-27', '2015-02-25', np.NaN, '2015-01-24', '2015-03-24'], errors='coerce'),
         pd.to_datetime(['2015-02-24', np.NaN, '2015-03-24', '2015-02-26', '2015-02-27', '2015-02-25'], errors='coerce')
       ])

df = pd.DataFrame(columns=['ID', 'BEFORE', 'AFTER'], data=mydata)

df.head(6)
返回

    ID  BEFORE      AFTER
0   11  2015-02-26  2015-02-24
1   22  2015-02-27  NaT
2   33  2015-02-25  2015-03-24
3   44  NaT         2015-02-26
4   66  2015-01-24  2015-02-27
5   77  2015-03-24  2015-02-25
我想找到之前和之后日期中较小的一个,然后用结果创建一个名为RELEVANT_DATE的新列。然后我可以在之前和之后放下。有无数种方法可以做到这一点,但对我来说,几乎所有的方法都不起作用。我所能做的就是这样

# fix up NaT's only in specific columns, real data has more columns
futureDate = pd.to_datetime('2099-01-01')
df.fillna({'BEFORE':futureDate, 'AFTER':futureDate}, inplace=True)

# super clunky solution
numRows = np.shape(df)[0]
relevantDate = []
for index in range(numRows):
    if df.loc[index, 'AFTER'] >= df.loc[index, 'BEFORE']:
        relevantDate.append(df.loc[index, 'BEFORE'])
    else:
        relevantDate.append(df.loc[index, 'AFTER'])

# add relevant date column to df
df['RELEVANT_DATE'] = relevantDate

# delete irrelevant dates
df.drop(labels=['BEFORE', 'AFTER'], axis=1, inplace=True)

df.head(6)
返回

    ID  RELEVANT_DATE
0   11  2015-02-24
1   22  2015-02-27
2   33  2015-02-25
3   44  2015-02-26
4   66  2015-01-24
5   77  2015-02-25
这种方法非常慢。对于几百万行,它需要太长的时间才有用


你能提供一个pythonic风格的解决方案吗?回想一下,我在矢量化这些操作和确保它们在数据帧中设置为实数方面都遇到了问题。

在一行中取最小值(
axis=1
)。设置索引,以便您可以随身携带
'ID'

df.set_index('ID').min(axis=1).rename('RELEVANT DATE').reset_index()

   ID RELEVANT DATE
0  11    2015-02-24
1  22    2015-02-27
2  33    2015-02-25
3  44    2015-02-26
4  66    2015-01-24
5  77    2015-02-25

或将新列指定给现有数据帧:

df['RELEVANT DATE'] = df[['BEFORE', 'AFTER']].min(1)

在一行中取最小值(
轴=1
)。设置索引,以便您可以随身携带
'ID'

df.set_index('ID').min(axis=1).rename('RELEVANT DATE').reset_index()

   ID RELEVANT DATE
0  11    2015-02-24
1  22    2015-02-27
2  33    2015-02-25
3  44    2015-02-26
4  66    2015-01-24
5  77    2015-02-25

或将新列指定给现有数据帧:

df['RELEVANT DATE'] = df[['BEFORE', 'AFTER']].min(1)