Pandas 2 个数据帧中的映射值和外连接 + 聚合值
Pandas mapping values in 2 dataframes and outer-join + aggregate values
你好,我有这两个数据帧
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
所以我需要执行这些 Actions 以将它们组合成 1 个数据帧:
1) 添加新列调用 df_2["title"] 以将 df_2["URL"] 值映射到 df_1[[=36 中的值=]]
2) 外部将两个数据帧连接在一起
3) 将 df_1["number"] 和 df_2["number"] 聚合 "date" 并将它们加在一起
这是我想要的结果:
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) 没有“/url-1”在 df_1 中似乎具有相同的日期。同样的问题也适用于 df_2;第 4 行
B) 如果我能达到我想要的 new_df
,我不介意跳过操作 1(如上粗体所示)
非常感谢您的帮助! :)
将标题添加到 df2,然后追加,然后分组依据:
df2 = df2.merge(df1.loc[:, ['title', 'URL']].drop_duplicates(), on='URL', how='left')
df = df1.append(df2)
# group by auto exclude NaN value, so fillna with placeholder first
df.fillna('null').groupby(['URL', 'date', 'title']).sum().reset_index()
使用Series.map
with 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))
你好,我有这两个数据帧
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
所以我需要执行这些 Actions 以将它们组合成 1 个数据帧:
1) 添加新列调用 df_2["title"] 以将 df_2["URL"] 值映射到 df_1[[=36 中的值=]]
2) 外部将两个数据帧连接在一起
3) 将 df_1["number"] 和 df_2["number"] 聚合 "date" 并将它们加在一起
这是我想要的结果:
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) 没有“/url-1”在 df_1 中似乎具有相同的日期。同样的问题也适用于 df_2;第 4 行
B) 如果我能达到我想要的 new_df
,我不介意跳过操作 1(如上粗体所示)非常感谢您的帮助! :)
将标题添加到 df2,然后追加,然后分组依据:
df2 = df2.merge(df1.loc[:, ['title', 'URL']].drop_duplicates(), on='URL', how='left')
df = df1.append(df2)
# group by auto exclude NaN value, so fillna with placeholder first
df.fillna('null').groupby(['URL', 'date', 'title']).sum().reset_index()
使用Series.map
with 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))