我有两个数据帧,分别是df1和df2
id first last size
A 1978-01-01 1979-01-01 2
B 2000-01-01 2000-01-01 1
C 1998-01-01 2000-01-01 3
D 1998-01-01 1998-01-01 1
E 1999-01-01 2000-01-01 2
id token
A ZA.00
B As.11
C SD.34
输出
id first last size
ZA.00 1978-01-01 1979-01-01 2
As.11 2000-01-01 2000-01-01 1
SD.34 1998-01-01 2000-01-01 3
D 1998-01-01 1998-01-01 1
E 1999-01-01 2000-01-01 2
如果df2中存在df1 id,则令牌值将设置df1 id值。 我该如何做到这一点。
答案 0 :(得分:1)
df = df1.merge(df2,how='outer')
df['id'] = df['token'].combine_first(df['id'] )
df.drop('token',inplace=True,axis=1)
另一种方法是将replace
与df2.values
的字典一起使用,此处df1数据帧会更改。:
df1.id.replace(dict(df2.values),inplace=True)
id first last size
0 ZA.00 1978-01-01 1979-01-01 2
1 As.11 2000-01-01 2000-01-01 1
2 SD.34 1998-01-01 2000-01-01 3
3 D 1998-01-01 1998-01-01 1
4 E 1999-01-01 2000-01-01 2
答案 1 :(得分:1)
使用map
和fillna
:
df1['id'] = df1['id'].map(df2.set_index('id')['token']).fillna(df1['id'])
df1
输出:
id first last size
0 ZA.00 1978-01-01 1979-01-01 2
1 As.11 2000-01-01 2000-01-01 1
2 SD.34 1998-01-01 2000-01-01 3
3 D 1998-01-01 1998-01-01 1
4 E 1999-01-01 2000-01-01 2
您可以将map
与一系列参数一起使用。
答案 2 :(得分:0)
如果您不希望合并DataFrame,则可以使用apply函数来解决此问题。将您的小型DataFrame更改为字典并将其映射到另一个DataFrame。
from io import StringIO #used to get string to df
import pandas as pd
id_ =list('ABC')
token = 'ZA.00 As.11 SD.34'.split()
dt = pd.DataFrame(list(zip(id_,token)),columns=['id','token'])
a ='''
id first last size
A 1978-01-01 1979-01-01 2
B 2000-01-01 2000-01-01 1
C 1998-01-01 2000-01-01 3
D 1998-01-01 1998-01-01 1
E 1999-01-01 2000-01-01 2
'''
df =pd.read_csv(StringIO(a), sep=' ')
# This last two lines are all you need
mp= {x:y for x,y in zip(dt.id.tolist(),dt.token.tolist())}
df.id.apply(lambda x: mp[x] if x in mp.keys() else x)