Python 使用Pandas随时间滚动数据组

Python 使用Pandas随时间滚动数据组,python,pandas,data-science,Python,Pandas,Data Science,你好,我正在尝试合并/滚动两个数据帧。 我希望合并“dfDates”和“dfProducts”,然后在“dfProducts”组/成员上滚动产品,直到新组/成员可用为止。 我尝试在两个数据帧之间使用外部连接,但我不知道如何滚动组 下面介绍数据帧的外观,以及我对“dfFinal”的看法 dfProducts Date Product 2018-01-01 A 2018-01-01 B 2018-01-01 C 2018-01-03

你好,我正在尝试合并/滚动两个数据帧。 我希望合并“dfDates”和“dfProducts”,然后在“dfProducts”组/成员上滚动产品,直到新组/成员可用为止。 我尝试在两个数据帧之间使用外部连接,但我不知道如何滚动组

下面介绍数据帧的外观,以及我对“dfFinal”的看法

dfProducts

   Date      Product

2018-01-01      A  
2018-01-01      B 
2018-01-01      C 
2018-01-03      D
2018-01-03      E
2018-01-03      F

dfDates

   Date        

2018-01-01       
2018-01-02   
2018-01-03       
2018-01-04      

dfFinal

   Date      Product

2018-01-01      A  
2018-01-01      B 
2018-01-01      C 
2018-01-02      A  
2018-01-02      B 
2018-01-02      C 
2018-01-03      D
2018-01-03      E
2018-01-03      F
2018-01-04      D
2018-01-04      E
2018-01-04      F


我所能看到的最简单的选择是首先按日期对所有内容进行分组,然后重新索引到所需的范围,将
nan
s放入空白点,然后填充以下内容:

(
    df
    .groupby("Date")
    ['Product']
    .apply(list)
    .reindex(pd.date_range(start=dfDates['Date'].min(), end=dfDates['Date'].max(), freq='D'))
    .fillna(method='ffill')
    .explode()
)

2018-01-01    A
2018-01-01    B
2018-01-01    C
2018-01-02    A
2018-01-02    B
2018-01-02    C
2018-01-03    D
2018-01-03    E
2018-01-03    F
2018-01-04    D
2018-01-04    E
2018-01-04    F
Name: Product, dtype: object

我所能看到的最简单的选择是首先按日期对所有内容进行分组,然后重新索引到所需的范围,将
nan
s放入空白点,然后填充以下内容:

(
    df
    .groupby("Date")
    ['Product']
    .apply(list)
    .reindex(pd.date_range(start=dfDates['Date'].min(), end=dfDates['Date'].max(), freq='D'))
    .fillna(method='ffill')
    .explode()
)

2018-01-01    A
2018-01-01    B
2018-01-01    C
2018-01-02    A
2018-01-02    B
2018-01-02    C
2018-01-03    D
2018-01-03    E
2018-01-03    F
2018-01-04    D
2018-01-04    E
2018-01-04    F
Name: Product, dtype: object

定义以下功能:

def getLastDateRows(dat, df):
    rows = df.query('Date == @dat')
    n = rows.index.size
    if n == 0:
        lastDat = df.Date[df.Date < dat].iloc[-1]
        rows = df.query('Date == @lastDat')
    return pd.DataFrame({ 'Date': dat, 'Product': rows.Product })
结果正如预期的那样

附录 Randy提出的解决方案可以稍加改进:

dfProducts.groupby('Date').Product.apply(list)\
    .reindex(dfDates.Date).ffill().explode().reset_index()
差异:

  • Reindex位于dfDates.Date(不是整个范围),因此结果将 仅包含dfDates中存在的日期,可以包含 有意的“间隙”,例如周末
  • 最后一次调用reset_index会导致结果是一个数据帧 (不是一个系列)

定义以下功能:

def getLastDateRows(dat, df):
    rows = df.query('Date == @dat')
    n = rows.index.size
    if n == 0:
        lastDat = df.Date[df.Date < dat].iloc[-1]
        rows = df.query('Date == @lastDat')
    return pd.DataFrame({ 'Date': dat, 'Product': rows.Product })
结果正如预期的那样

附录 Randy提出的解决方案可以稍加改进:

dfProducts.groupby('Date').Product.apply(list)\
    .reindex(dfDates.Date).ffill().explode().reset_index()
差异:

  • Reindex位于dfDates.Date(不是整个范围),因此结果将 仅包含dfDates中存在的日期,可以包含 有意的“间隙”,例如周末
  • 最后一次调用reset_index会导致结果是一个数据帧 (不是一个系列)

  • 如果您执行
    start=df['Date'].min()
    end=df['Date'].max(),则会更加通用,除了这个好答案+1个好建议-我会修改。我尝试了这个方法,但代码不起作用,并返回给我以下错误:AttributeError:“Series”对象没有属性“explode”。我发现了与“explode”相关的错误。我的熊猫不在当前版本中,因此“爆炸”不可用。我更新了库,现在一切都正常了:)其他快速问题:如果我的“dfProducts”有其他列(即“ProductPrice”、“ProductDetail”…),我如何分解此数据帧?如果执行
    start=df['Date'].min()
    end=df['Date'].max(),则会更一般,除了这个好答案+1个好建议-我会修改。我尝试了这个方法,但代码不起作用,并返回给我以下错误:AttributeError:“Series”对象没有属性“explode”。我发现了与“explode”相关的错误。我的熊猫不在当前版本中,因此“爆炸”不可用。我更新了库,现在一切正常:)其他快速问题:如果我的“dfProducts”有其他列(即“ProductPrice”、“ProductDetail”…),我如何分解此数据帧?