Python 获取pandas中唯一列值的日期索引

Python 获取pandas中唯一列值的日期索引,python,pandas,dataframe,Python,Pandas,Dataframe,给定一个看起来像这样的数据帧: contractID Date 1982-09-16 (SPZ1982, 1982-12-16 00:00:00) 1982-09-17 (SPZ1982, 1982-12-16 00:00:00) 1982-09-20 (SPZ1982, 1982-12-16 00:00:00)

给定一个看起来像这样的数据帧:

                                contractID
Date                                      
1982-09-16  (SPZ1982, 1982-12-16 00:00:00)
1982-09-17  (SPZ1982, 1982-12-16 00:00:00)
1982-09-20  (SPZ1982, 1982-12-16 00:00:00)
                                   ...
2018-09-27  (SPZ2018, 2018-12-21 00:00:00)
2018-09-28  (SPZ2018, 2018-12-21 00:00:00)
2018-10-01  (SPZ2018, 2018-12-21 00:00:00)
def query(df, tup, startDate, endDate):
    ID = tup[0]
    ExpirationDate = tup[1]
    panel = df.loc[ID].loc[ExpirationDate].loc[startDate:endDate]
    return panel

df = pd.DataFrame()
print('acquiring daily data...')
for tup in contractUse['contractID'].unique():
    panel = query(rawData, tup, startDate, endDate)
    if df.empty:
        df = panel
    else:
        df = df.append(panel, verify_integrity=False)

return df
我有重复的
compract
s,我想有效地对这些ID执行操作,比如:

                                contractID
Date                                      
1982-09-16  (SPZ1982, 1982-12-16 00:00:00)
1982-09-17  (SPZ1982, 1982-12-16 00:00:00)
1982-09-20  (SPZ1982, 1982-12-16 00:00:00)
                                   ...
2018-09-27  (SPZ2018, 2018-12-21 00:00:00)
2018-09-28  (SPZ2018, 2018-12-21 00:00:00)
2018-10-01  (SPZ2018, 2018-12-21 00:00:00)
def query(df, tup, startDate, endDate):
    ID = tup[0]
    ExpirationDate = tup[1]
    panel = df.loc[ID].loc[ExpirationDate].loc[startDate:endDate]
    return panel

df = pd.DataFrame()
print('acquiring daily data...')
for tup in contractUse['contractID'].unique():
    panel = query(rawData, tup, startDate, endDate)
    if df.empty:
        df = panel
    else:
        df = df.append(panel, verify_integrity=False)

return df
其中,
contractUse
是上面介绍的数据帧。我只想迭代唯一的值。当我迭代唯一值时,我需要得到该唯一值开始时的索引值,以及该唯一值停止时的索引值。然后,我将唯一值的
startDate
endDate
提供给我的
query
函数。在熊猫中有没有快速的方法可以做到这一点?

你需要做两件事:

  • 不要使用一系列元组。将其分为两个独立的系列
  • 使用
    GroupBy
    根据列将数据帧分割成块
  • 因此,首先拆分您的
    压缩序列:

    df[['key', 'contract_date']] = pd.DataFrame(df.pop('contractID').values.tolist())
    
    g = df.groupby('key')
    
    然后按新创建的
    序列分组:

    df[['key', 'contract_date']] = pd.DataFrame(df.pop('contractID').values.tolist())
    
    g = df.groupby('key')
    
    提取组的“开始和结束”索引现在与提取组并查看其索引一样简单。例如:

    idx_start, idx_end = g.get_group('SPZ1982').index[[0, -1]]
    
    您需要做两件事:

  • 不要使用一系列元组。将其分为两个独立的系列
  • 使用
    GroupBy
    根据列将数据帧分割成块
  • 因此,首先拆分您的
    压缩序列:

    df[['key', 'contract_date']] = pd.DataFrame(df.pop('contractID').values.tolist())
    
    g = df.groupby('key')
    
    然后按新创建的
    序列分组:

    df[['key', 'contract_date']] = pd.DataFrame(df.pop('contractID').values.tolist())
    
    g = df.groupby('key')
    
    提取组的“开始和结束”索引现在与提取组并查看其索引一样简单。例如:

    idx_start, idx_end = g.get_group('SPZ1982').index[[0, -1]]
    

    开始和停止索引是问题所指的,函数查询现在也在文章中,以便澄清。我想要的输出只是查询函数的结果,我遇到的问题是获取它的参数startDate和endDate。我更新了帖子来解释它们是什么。@Évariste Galois,我相信jpp要求您将所需的输出复制/粘贴为数据帧。就目前而言,这个问题很难理解,我们也很难帮助您。开始和停止索引就是问题所指的,函数查询现在也在帖子中,以便澄清。我想要的输出只是查询函数的结果,我遇到的问题是获取其参数,开始日期和结束日期。我更新了帖子来解释它们是什么。@Évariste Galois,我相信jpp要求您将所需的输出复制/粘贴为数据帧。就目前而言,这个问题很难理解,我们也很难帮助您。这个解决方案很有意义,但将我的元组列转换为两列似乎使DF有2个NaN和NaT列。。。但它的转换方式在我看来是正确的。我缺少了什么吗?问题是我是如何构造新的数据框架的,使用构造函数的
    索引
    参数解决了我的问题。这是一个非常优雅的解决方案,谢谢!这个解决方案是有意义的,但是将我的元组列转换为两列似乎使DF有2个NaN和NaT列。。。但它的转换方式在我看来是正确的。我缺少了什么吗?问题是我是如何构造新的数据框架的,使用构造函数的
    索引
    参数解决了我的问题。这是一个非常优雅的解决方案,谢谢!