Python用另一个数据帧的值更新数据帧,而不替换现有的数据帧

2024-04-19 21:36:51 发布

您现在位置:Python中文网/ 问答频道 /正文

当列中已经有值时,更新数据帧时遇到问题。你知道吗

下面是一个例子

import pandas as pd
df = pd.DataFrame({
                  'email':['1@dummy.com','2@dummy.com','3@dummy.com','4@dummy.com'],
                  'Name': ['John', 'Sam',None,None],
                  'id': ['A0', 'A1','A2', 'A3'], }
                     )
df

    df
        Name    email   id
    0   John    1@dummy.com A0
    1   Sam     2@dummy.com A1
    2   None    3@dummy.com A2
    3   None    4@dummy.com A3

ref_df = pd.DataFrame({
                  'email':['1@dummy.com','2@dummy.com','3@dummy.com','4@dummy.com'],
                  'Name': ['', 'Sam','Tim','Sara'],
                  'random': ['f', 's','r', 'a'], }
                     )
ref_df
Name           email      random
0           1@dummy.com     f
1   Sam     2@dummy.com     s
2   Tim     3@dummy.com     r
3   Sara    4@dummy.com     a

我想要的结果如下:

Name           email    id
0   John    1@dummy.com A0
1   Sam     2@dummy.com A1
2   Tim     3@dummy.com A2
3   Sara    4@dummy.com A3

我想基于email在ref\u df中用值填充Name,但保留现有值。只更新name中的空值。也只保留df中的原始列(去掉ref\u df中的随机列)

我还希望能够重复这样做,因为我想用来自不同来源的多个ref\ u df更新df。你知道吗

下面是我尝试过的,如果我逐行运行代码,这是可行的,但是一旦我将它包装到一个函数中,我就得到了一个keyerror。你知道吗

我相信有更好的办法。感谢您的帮助!你知道吗

def update_df(df, index, ref_df, ref_cols,how='inner',left_on=None,
              right_on=None,):
    df = init_columns(df, cols=ref_cols)
    cols_to_keep = list(df.columns)
    gap_cols = df.columns.difference(ref_df.columns)
    gap_df = merge(
        df[gap_cols],
        ref_df,
        how,
        left_on,
        right_on,
    )
    gap_df = gap_df[cols_to_keep].set_index(index)
    df = df.set_index(index)
    df.update(gap_df)
    df=df[cols_to_keep]
    return df

Tags: columnsnamecomnonerefdfindexon
2条回答

我所做的是将您的ref_df转换为字典,以便我们可以应用映射。你知道吗

ref_dict = dict(zip(ref_df["email"], ref_df["Name"]))
ref_dict

这将为您提供:

{'1@dummy.com': 'John',
 '2@dummy.com': 'Sam',
 '3@dummy.com': 'Tim',
 '4@dummy.com': 'Sara'}

然后,您可以:

df["Name"] = df["email"].map(ref_dict)

您将拥有:

    Name          email id
0   John    1@dummy.com A0
1   Sam     2@dummy.com A1
2   Tim     3@dummy.com A2
3   Sara    4@dummy.com A3

这将重新创建Name列,如果您担心这可能会更改某些现有值,则只能填充NA

这应该起作用:

df['Name'] = df['Name'].fillna(df['email'].map(ref_df.set_index('email')['Name']))

其工作方式是从ref_df创建一个emailName的映射,然后用它来填充数据帧中的空白。你知道吗

相关问题 更多 >