按日期拆分DataFrame,并通过追加新记录并覆盖现有

时间:2017-08-09 15:47:49

标签: python pandas dataframe

编辑:我更新了以下说明,以便更清楚地说明我要完成的工作。

我是一个相当新的Python用户(我通常使用R但我正在尝试学习Python)。我正在尝试使用pandas来完成以下任务。

我有一个类似下面的DataFrame(df)(我的真实数据集有更多列):

  PROG.ID   TITLE   STATUS   DataDate     
  --------- ------- -------- --------------
  KEY1      Key 1   A        2007-01-01       
  KEY2      Key 2   A        2007-01-01       
  KEY3      Key 3   A        2008-07-01       
  KEY2      Key 2   I        2009-07-01       
  KEY4      Key 4   A        2010-01-01       

我正在尝试根据dataframe字段输出多个DataDate,如下所示:

File_2007-01-01.csv

  PROG.ID   TITLE   STATUS   DataDate     
  --------- ------- -------- --------------
  KEY1      Key 1   A        2007-01-01       
  KEY2      Key 2   A        2007-01-01       

KEY1和KEY2都被添加,因为这些是具有此日期的唯一记录。

File_2008-07-01.csv

  PROG.ID   TITLE   STATUS   DataDate     
  --------- ------- -------- --------------
  KEY1      Key 1   A        2007-01-01       
  KEY2      Key 2   A        2007-01-01       
  KEY3      Key 3   A        2008-07-01       

KEY3被添加,因为它不存在。

File_2009-07-01.csv

  PROG.ID   TITLE   STATUS   DataDate     
  --------- ------- -------- --------------
  KEY1      Key 1   A        2007-01-01       
  KEY2      Key 2   I        2009-07-01       
  KEY3      Key 3   A        2008-07-01       

注意KEY2已被最新记录替换。其他记录保持不变。

File_2009-07-01.csv

  PROG.ID   TITLE   STATUS   DataDate     
  --------- ------- -------- --------------
  KEY1      Key 1   A        2007-01-01       
  KEY2      Key 2   I        2009-07-01       
  KEY3      Key 3   A        2008-07-01       
  KEY4      Key 4   A        2010-01-01       

增加了KEY4。其他记录保持不变。

我尝试使用如下代码(但这不起作用):

df = df.set_index('PROG.ID')
result = pd.DataFrame()
for key, data in df.groupby('DataDate'):
    if result.empty:
        result.data.copy()
    else:
        result.combine_first(data)
        result.update(data)
    result.to_csv('./File_{dt}.csv'.format(dt=key))

第一个文件写得正确,但所有后续文件都与第一个文件具有相同的数据。

据我了解,combine_first()将保留所有result并添加data中尚未包含result的行,而update()result使用data中已存在密钥的result中的值覆盖update()中的值。为了完整起见,我在combine_first()之前尝试了Author_ID FirstName LastName 1 Rock Smith 2 Edward Thomas

不幸的是,这不能按预期工作。我已经查看了过去已经回答过的其他问题,但我发现没有回答如何更新所有现有记录但添加新记录。

为了回答这个问题,我们有一个现有的工作流程,它将数据格式化为输出格式并对其进行处理。我需要这些数据流经同一个工作流程。

非常感谢任何见解。

1 个答案:

答案 0 :(得分:1)

IIUC:

df = df.sort_values('DataDate')

for d in df['DataDate'].dt.strftime('%Y-%m-%d').unique():
    df.loc[df['DataDate'] <= d] \
      .groupby('PROG.ID', as_index=False).last() \
      .to_csv(r'd:/temp/File_{}.csv'.format(d), index=False)

结果:

<强> File_2007-01-01.csv

PROG.ID,TITLE,STATUS,DataDate
KEY1,Key 1,A,2007-01-01
KEY2,Key 2,A,2007-01-01

<强> File_2008-07-01.csv

PROG.ID,TITLE,STATUS,DataDate
KEY1,Key 1,A,2007-01-01
KEY2,Key 2,A,2007-01-01
KEY3,Key 3,A,2008-07-01

<强> File_2009-07-01.csv

PROG.ID,TITLE,STATUS,DataDate
KEY1,Key 1,A,2007-01-01
KEY2,Key 2,I,2009-07-01
KEY3,Key 3,A,2008-07-01

<强> File_2010-01-01.csv

PROG.ID,TITLE,STATUS,DataDate
KEY1,Key 1,A,2007-01-01
KEY2,Key 2,I,2009-07-01
KEY3,Key 3,A,2008-07-01
KEY4,Key 4,A,2010-01-01