您好,我有这两个数据框
df_1
title URL number date
a /url-1 1 21-02-2020
a /url-1 10 20-02-2020
a /url-1 17 18-02-2020
b /url-2 100 21-02-2020
b /url-2 106 20-02-2020
df_2
URL number date
/url-1 5 21-02-2020
/url-1 12 20-02-2020
/url-1 50 19-02-2020
/url-2 71 17-02-2020
/url-3 9 21-02-2020
/url-3 11 20-02-2020
因此,我需要执行以下操作将它们组合为1个数据帧:
1)添加新的列调用df_2 [“ title”]以将df_2 [“ URL”]值映射到df_1 [“ title”]中的值
2)将两个数据框外部连接在一起
3)按“日期”汇总df_1 [“ number”]和df_2 [“ number”]并将它们加在一起
这是我想要的结果:
new_df
title URL number date
a /url-1 6 21-02-2020
a /url-1 22 20-02-2020
a /url-1 50 19-02-2020
a /url-1 17 18-02-2020
b /url-2 100 21-02-2020
b /url-2 106 20-02-2020
b /url-2 71 17-02-2020
null /url-3 9 21-02-2020
null /url-3 11 20-02-2020
注意事项:
A)我不能仅仅在“ URL”和“ date”上进行外部联接,因为您会注意到在df_2中;第3行(19-02-2020)在df_1中对于“ / url- 1“。同样的问题也适用于df_2;第4行
B)如果我可以实现new_df的目标,则我不介意跳过操作1(如上粗体所示)
非常感谢您的帮助!:)
Series.map
与一起使用DataFrame.drop_duplicates
,然后将新列用于外部联接,最后一sum
列:
df_2["title"] = df_2["URL"].map(df_1.drop_duplicates('URL').set_index('URL')["title"])
df = df_1.merge(df_2, on=['title','URL','date'], how='outer', suffixes=('','_'))
df['number'] = df['number'].add(df.pop('number_'), fill_value=0)
print (df)
title URL number date
0 a /url-1 6.0 21-02-2020
1 a /url-1 22.0 20-02-2020
2 a /url-1 17.0 18-02-2020
3 b /url-2 100.0 21-02-2020
4 b /url-2 106.0 20-02-2020
5 a /url-1 50.0 19-02-2020
6 b /url-2 71.0 17-02-2020
7 NaN /url-3 9.0 21-02-2020
8 NaN /url-3 11.0 20-02-2020
最后,如果需要的话,汇总sum
-因为缺少值是必要的,请用一些不丢失的值替换值:
df = (df.fillna('tmp')
.groupby(['URL', 'date', 'title'], as_index=False)['number']
.sum()
.replace({'tmp':np.nan})
.reindex(df.columns, axis=1))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句