有没有一种简单的方法可以在数据帧中的first末尾之前包含值?

时间:2020-07-23 13:16:12

标签: python pandas dataframe

我正在使用非常方便的pandas dataframe last(..)函数。在我的用例中,我正在执行以下操作以获取属于数据的最后一个月的所有样本(我正在处理每日数据,使用2D频率不污染问题):

import pandas as pd
import numpy as np

df = pd.DataFrame({'A': np.random.rand(10)}, 
                  index=pd.date_range('2020-06-23', periods=10, freq='2D'))
print(df)
                   A
2020-06-23  0.893443
2020-06-25  0.256981
2020-06-27  0.544561
2020-06-29  0.712149
2020-07-01  0.500871
2020-07-03  0.948928
2020-07-05  0.816448
2020-07-07  0.939283
2020-07-09  0.760055
2020-07-11  0.394204

print(df.last('1M'))
                   A
2020-07-01  0.500871
2020-07-03  0.948928
2020-07-05  0.816448
2020-07-07  0.939283
2020-07-09  0.760055
2020-07-11  0.394204

我基本上想要的是最后一个结果加上最后一个月前一个月的最后一个样本:

                   A
2020-06-29  0.712149
2020-07-01  0.500871
2020-07-03  0.948928
2020-07-05  0.816448
2020-07-07  0.939283
2020-07-09  0.760055
2020-07-11  0.394204

我需要上个月加上一个样本之前(由于计算上个月第一天的收益还需要第一天的t-1)。我可以想出一种更复杂的方法来做到这一点,但我想知道是否会有一种惯用而优雅的方法来做到这一点,而不是放弃漂亮的last用例。

2 个答案:

答案 0 :(得分:2)

我认为没有任何内置的pandas方法或参数可以像pd.DataFrame.last那样方便,但是,我认为一种实用的方法是使用dataframe索引和{{1 }}:

tail

输出:

df = pd.DataFrame({'A': np.random.rand(10)}, 
                  index=pd.date_range('2020-06-23', periods=10, freq='2D'))

last_month = df.last('1M')

last_month = pd.concat([df[~df.index.isin(last_month.index)].tail(1),
                        last_month])

last_month

答案 1 :(得分:1)

我想出了另一种方法,不得不改用每天的频率才能正常工作:

import pandas as pd
import numpy as np
df = pd.DataFrame({'A': np.random.rand(10)}, 
                  index=pd.date_range('2020-06-25', periods=10, freq='1D'))
print(df)
                   A
2020-06-25  0.011542
2020-06-26  0.165026
2020-06-27  0.414716
2020-06-28  0.385021
2020-06-29  0.615932
2020-06-30  0.967423
2020-07-01  0.383592
2020-07-02  0.336468
2020-07-03  0.610473
2020-07-04  0.569487

custom_last_m_idx = df.last('1M').index.insert(0, df.last('1M').index[0] + pd.DateOffset(days=-1))
print(df.loc[custom_last_m_idx])
                   A
2020-06-30  0.967423
2020-07-01  0.383592
2020-07-02  0.336468
2020-07-03  0.610473
2020-07-04  0.569487