当列中已经有值时,更新数据帧时遇到问题。你知道吗
下面是一个例子
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
我所做的是将您的
ref_df
转换为字典,以便我们可以应用映射。你知道吗这将为您提供:
然后,您可以:
您将拥有:
这将重新创建
Name
列,如果您担心这可能会更改某些现有值,则只能填充NA
列这应该起作用:
其工作方式是从
ref_df
创建一个email
到Name
的映射,然后用它来填充数据帧中的空白。你知道吗相关问题 更多 >
编程相关推荐