【问题标题】:Update a column everytime a new row is added to a dataframe每次将新行添加到数据框中时更新一列
【发布时间】:2019-05-23 00:39:33
【问题描述】:

我有一个如下所示的数据框 df1:

    use_id  user_id platform    platform_version    device
0   22782   26980   ios         10.2                iPhone7
1   22783   29628   android     6.0                 Nexus 5
2   22784   28473   android     5.1                 SM-G903F
3   22785   15200   ios         10.2                iPhone7
4   22786   28239   android     6.0                 ONE E1003
5   22787   12921   android     4.3                 GT-I9505
6   22788   28714   android     6.0                 SM-G930F
7   22789   28714   android     6.0                 SM-G930F
8   22790   29592   android     5.1                 D2303
9   22791   28775   ios         10.2                iPhone6

和第二个数据帧 df2(df1 的子集):

    use_id  user_id   device       date_created
0   22782   26980     iPhone7      2018/12/12
1   22783   29628     Nexus 5      2019/01/15
2   22784   28473     SM-G903F     2019/01/23
3   22785   15200     iPhone7      2019/01/23
4   22786   28239     ONE E1003    2019/01/23

我想识别 df1 中不存在于 df2 中的新行,将它们附加到 df2,然后使用输入日期更新“date_created”列。

所以 df2 会是这样的:

    use_id  user_id   device       date_created
0   22782   26980     iPhone7      2018/12/12
1   22783   29628     Nexus 5      2019/01/15
2   22784   28473     SM-G903F     2019/01/23
3   22785   15200     iPhone7      2019/01/23
4   22786   28239     ONE E1003    2019/01/23   
5   22787   12921     GT-I9505     2019/05/22
6   22788   28714     SM-G930F     2019/05/22
7   22789   28714     SM-G930F     2019/05/22
8   22790   29592     D2303        2019/05/22
9   22791   28775     iPhone6      2019/05/22

我能够使用 merge() 获得两个数据帧的差异:

mergedStuff = pd.merge(df1['use_id', 'user_id', 'device'], df2, on=['use_id', 'user_id', 'device'], how='outer', indicator=True).loc[mergedStuff['_merge'] == 'left_only']

然后将新行追加到 df2:

df2 = df2.append(mergedStuff, ignore_index=True)

但我正在努力如何为新的附加行添加如下所示的创建日期。

df2['date_created'] = pd.datetime.now()

有没有简单的方法来实现这一点?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    使用左连接合并两个框架并将指示器设置为 True:

    df_merged=pd.merge(df1,df2,how='left',indicator=True)
    

    只过滤掉左侧框架中包含的行

    df_merged=df_merged.loc[df_merged['_merge']=='left_only']
    

    df_merged['Created']=pd.Timestamp.now()

    【讨论】:

    • 直接点赞:pd.merge(df1,df2,how='left',indicator=True).query('_merge=="left_only"') :)
    【解决方案2】:

    您可以使用 pandas 内置的日期时间功能在合并之前将创建日期字段添加到 df1。

    df1['date_created'] = pd.Timestamp.now()
    #to keep just the date part
    df1['date_created'] = df1['date_created'].dt.date
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-20
      • 2019-03-27
      • 2019-04-07
      相关资源
      最近更新 更多