首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >熊猫在两个数据中映射值和外部连接+聚合值

熊猫在两个数据中映射值和外部连接+聚合值
EN

Stack Overflow用户
提问于 2020-02-25 06:20:35
回答 1查看 170关注 0票数 1

你好,我有这两个数据

代码语言:javascript
复制
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
代码语言:javascript
复制
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)添加新的列调用df_2"title“,将df_2"URL”值映射到df_1“df_1”中的值

2)外部将两个数据格式连接在一起

3)将df_1"number“和df_2"number”合并为"date“,并将它们加在一起

这就是我想要的结果:

代码语言:javascript
复制
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

需要注意的事项:

我不能只在"URL“和" date”上进行外部连接,因为您可以注意到,在df_2;row 3 (19-02-2020)中,df_1中的"/url-1“似乎没有相同的日期。同样的问题也适用于df_2;row 4

如果我能实现我想要的new_df,我不介意跳过操作1(如上面的粗体)

(非常感谢您的帮助!)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-25 06:41:23

Series.mapDataFrame.drop_duplicates一起使用,然后新列用于外部连接,最后一个sum列:

代码语言:javascript
复制
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 --因为缺少值是必需的,所以必须用一些不丢失的值替换值:

代码语言:javascript
复制
df = (df.fillna('tmp')
         .groupby(['URL', 'date', 'title'], as_index=False)['number']
         .sum()
         .replace({'tmp':np.nan})
         .reindex(df.columns, axis=1))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60388572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档