【问题标题】:Combining two dataframes and filling blanks in one with values of another (using email as index)将两个数据框组合起来并用另一个值填充一个空白(使用电子邮件作为索引)
【发布时间】:2021-09-22 13:21:06
【问题描述】:

我有两个具有以下列的数据框:电话、电子邮件和姓名

Dataframe1 的长度为 20k,而 dataframe2 的长度为 1k。我想使用电子邮件作为两个数据框之间的匹配索引,用 dataframe2 中的电话号码填充 dataframe1 中 Phone 列中的空白。

最好的方法是什么?我试过 combine_frist()Merge() 但 combine_first() 返回同一行中的值,而不是与电子邮件地址匹配的值。 Merge() 的结果是一样的。

我认为我需要将电子邮件设置为索引然后将电话映射到该索引是错误的吗?我觉得这是正确的,但我根本不知道该怎么做。任何帮助表示赞赏!谢谢你:)

例子:

In [1] 
import pandas as pd
df1 = pd.DataFrame({'Phone': [1, NaN, 3, 4, 5, NaN, 7], 
                   'Name': ['Bob', 'Jon', 'Iris', 'Jacob','Donald','Beatrice','Jane'],
                   'Email': ['bob@gmail.com','jon@gmail.com','iris@gmail.com','jacob@gmail.com','donald@gmail.com','beatrice@gmail.com','jane@gmail.cm'})

df2 = pd.DataFrame({'Phone': [2, 1, 3, 5],
                  'Name': ['Jon', 'Bob', 'Donald'],
                  'Email': ['jon@gmail.com','bob@gmail.com', 'donald@gmail.com'})
In [2]: df1 
Out [2]:
Phone  Name  Email
1      Bob   bob@gmail.com
NaN    Jon   jon@gmail.com
3      Iris  iris@gmail.com
4      Jac   jacob@gmail.com
5      Don   donald@gmail.com
NaN    Bea   beatrice@gmail.com
7      Jane  jane@gmail.com
x 20000 len
In [3]: df2
Out [3]:
Phone  Name  Email
2      Jon   jon@gmail.com
1      Bob   bob@gmail.com
6      Bea   beatrice@gmail.com
5      Don   donald@gmail.com
x 1100 len

我尝试过的

In [4]: df3 = pd.merge(df1,df2, on="Email", how="left")
Out [4]:
Phone  Name  Email
1      Bob   bob@gmail.com
1      Jon   jon@gmail.com
3      Iris  iris@gmail.com
4      Jac   jacob@gmail.com
5      Don   donald@gmail.com
NaN    Bea   beatrice@gmail.com
7      Jane  jane@gmail.com

In [5]: df3 = df1.combine_first(df2)
Out [5]:
Phone  Name  Email
1      Bob   bob@gmail.com
1      Jon   jon@gmail.com
3      Iris  iris@gmail.com
4      Jac   jacob@gmail.com
5      Don   donald@gmail.com
NaN    Bea   beatrice@gmail.com
7      Jane  jane@gmail.com

我希望它是什么样子:

In [6]: df3
Out [6]
1      Bob   bob@gmail.com
2      Jon   jon@gmail.com
3      Iris  iris@gmail.com
4      Jac   jacob@gmail.com
5      Don   donald@gmail.com
6      Bea   beatrice@gmail.com
7      Jane  jane@gmail.com

【问题讨论】:

标签: python pandas merge


【解决方案1】:

像这样构造数据框:

df1 = pd.DataFrame({'Phone': [1, NaN, 3, 4, 5, NaN, 7], 
                   'Name': ['Bob', 'Jon', 'Iris', 'Jacob','Donald','Beatrice','Jane'],
                   'Email': ['bob@gmail.com','jon@gmail.com','iris@gmail.com','jacob@gmail.com','donald@gmail.com','beatrice@gmail.com','jane@gmail.cm']})

df2 = pd.DataFrame({'Phone': [2, 1, 5, 6],
                  'Name': ['Jon', 'Bob', 'Donald', 'Beatrice'],
                  'Email': ['jon@gmail.com','bob@gmail.com', 'donald@gmail.com', 'beatrice@gmail.com']})

合并给出:

>>> df1.merge(df2, on='Email', how='left')
   Phone_x    Name_x               Email  Phone_y    Name_y
0      1.0       Bob       bob@gmail.com      1.0       Bob
1      NaN       Jon       jon@gmail.com      2.0       Jon
2      3.0      Iris      iris@gmail.com      NaN       NaN
3      4.0     Jacob     jacob@gmail.com      NaN       NaN
4      5.0    Donald    donald@gmail.com      5.0    Donald
5      NaN  Beatrice  beatrice@gmail.com      6.0  Beatrice
6      7.0      Jane       jane@gmail.cm      NaN       NaN

然后在列上减少Phone

>>> df1.merge(df2, on='Email', how='left')[['Phone_x', 'Phone_y']].ffill(axis=1)
   Phone_x  Phone_y
0      1.0      1.0
1      NaN      2.0
2      3.0      3.0
3      4.0      4.0
4      5.0      5.0
5      NaN      6.0
6      7.0      7.0

重新分配该结果中最右侧的列 - 如果将输出分配给 result,则由 result.iloc[:, -1] 访问 - 作为原始数据框的新列。

【讨论】:

    猜你喜欢
    • 2023-03-17
    • 2019-09-23
    • 2018-04-20
    • 2017-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    相关资源
    最近更新 更多