基于其他时间戳将时间戳添加到 pandas 数据帧的 Pythonic 方法
Pythonic way to add Timestamps to pandas dataframe based on other Timestamps
索引到 pandas 数据帧以更改值的时髦方式对我来说很难。我永远无法弄清楚我是在更改数据框元素的值,还是在更改该值的副本。
我对 python 的数组操作语法也不熟悉,并且努力将索引循环(如在 C++ 中)转换为 python 中的向量操作。
我的问题是我希望根据其他列中的值将一列 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)
哪个returns
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 的新列。然后我可以删除 BEFORE 和 AFTER。有无数种方法可以做到这一点,但对我来说,几乎所有方法都行不通。我能做的最好的就是这个
# 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 风格的解决方案吗?回想一下,我在向量化这些操作和确保它们在 DataFrame 中得到真实设置时遇到了麻烦。
取一行中的最小值 (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
或者将新列分配给您现有的 DataFrame:
df['RELEVANT DATE'] = df[['BEFORE', 'AFTER']].min(1)
索引到 pandas 数据帧以更改值的时髦方式对我来说很难。我永远无法弄清楚我是在更改数据框元素的值,还是在更改该值的副本。
我对 python 的数组操作语法也不熟悉,并且努力将索引循环(如在 C++ 中)转换为 python 中的向量操作。
我的问题是我希望根据其他列中的值将一列 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)
哪个returns
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 的新列。然后我可以删除 BEFORE 和 AFTER。有无数种方法可以做到这一点,但对我来说,几乎所有方法都行不通。我能做的最好的就是这个
# 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 风格的解决方案吗?回想一下,我在向量化这些操作和确保它们在 DataFrame 中得到真实设置时遇到了麻烦。
取一行中的最小值 (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
或者将新列分配给您现有的 DataFrame:
df['RELEVANT DATE'] = df[['BEFORE', 'AFTER']].min(1)