每次将新行添加到数据框时更新一列

时间:2019-05-22 16:07:37

标签: python pandas dataframe

我有一个看起来像这样的数据框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

我想确定df2​​中不存在的df1中的新行,将它们附加到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()

有没有简单的方法可以实现这一目标?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

使用左联接合并两个框架并将指示器设置为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()